2016-08-04 7 views
1

Предположит, что у меня есть следующая хранимая процедура:SQL Server хранимых процедуры: установленное значение по умолчанию для входного параметра, хотя выполнения запроса

CREATE PROCEDURE test 
    @my_var varbinary 
AS 
    SELECT @my_var as my_var 

Однако я хочу изменить его так, что @my_var имеет значение по умолчанию. Я не знаю, что такое значение буквально, но я знаю, где его можно получить в базе данных.

Что-то вроде:

declare @var int 
SELECT @var = my_variable from my_table where something = 'what I need' 
GO 

CREATE PROCEDURE test 
    @my_var varbinary = @var 
AS 
    SELECT @my_var as my_var 

Однако это не удается. Кажется, что @var выпадает из сферы действия.

Можно ли что-то сделать?

Спасибо!

+0

Будет ли это значение когда-либо изменяться или оно будет одинаковым на протяжении всего срока службы хранимая процедура? –

+0

Это может быть, ОДНАКО, я только хочу выполнить запрос один раз, захватить это значение и поместить его в качестве значения по умолчанию в SP. Другими словами, запрос может не обязательно возвращать одно и то же значение отныне до конца времен, но я только забочусь о значении, которое я захватываю с помощью этого запроса в данный момент, когда я создаю SP. По этой причине установка значения по умолчанию для NULL и выполнение проверки if внутри SP и вызов запроса отсюда, к сожалению, не является вариантом. – doubleOK

+0

Вы делаете свой выбор _inside_ proc, сразу после 'AS' и устанавливаете значение' @ my_var' –

ответ

2

Чтобы использовать значение во время выполнения:

CREATE PROCEDURE test 
    @my_var varbinary = NULL 
AS 
BEGIN 
IF @my_var IS NULL 
    SELECT @my_var = my_variable from my_table where something = 'what I need' 

    SELECT @my_var as my_var 
END 

использовать значение во время создания, построить CREATE PROC строку и выполнить его

declare @var int 
declare @SQL VARCHAR(4000) 

SELECT @var = id from sysobjects where id =3 



SET @SQL = 'CREATE PROCEDURE test @my_var varbinary = ' + CAST(@var AS VARCHAR(20)) + ' 
AS 
    SELECT @my_var as my_var' 

EXEC(@SQL) 

Как я уже говорил .. если вы только создавая это один раз, зачем беспокоиться о том, что это сложно? Если вы создаете его много раз, вам нужно просто сделать это во время выполнения. Может возникнуть некоторый вызов для этого, если вы развертываете во многие базы данных, но в таком случае вам может потребоваться обернуть это в проект базы данных.

+0

Будет ли выполняться 1-й запрос выбора только один раз, когда хранимая процедура будет создана или будет выполняться каждый раз, когда это будет называется? Благодаря! – doubleOK

+0

каждый раз. Вы беспокоитесь, что ценность изменится или вы будете беспокоиться о производительности? –

+0

Я не беспокоюсь о производительности. Я беспокоюсь, что ценность может быть иной. Есть ли способ запускать только один раз и жесткий код, который стоит в SP? – doubleOK