Выполнить SQL с «SELECT @daynamic_variable_name» в SQL SERVER - PullRequest
0 голосов
/ 10 октября 2018

Через exec в SQL Server я хочу получить значение параметра динамически.Пожалуйста, посмотрите на приведенный ниже пример:

declare @p1 varchar(50) = '10'
declare @p2 varchar(50) = '20'

declare @p_nm varchar(50)

set @p_nm = '@p1' -- OR set @p_nm = '@p2'
declare @sql varchar(50) = 'select @p1'

declare @ans_val varchar(50) 
set @ans_val = exec @sql

Как я могу получить результат 10 при использовании set @p_nm = '@ p1' и 20 при использовании set @p_nm = '@ p2' ?

В моем случае set @ans_val = exec @ sql с синтаксической ошибкой.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Я сделаю это так:

EXECUTE sp_executesql   
        N'SELECT @Var AS Result',
        N'@Var VARCHAR(5)',
        @Var = '12345';

Результаты:

+----+--------+
|    | Result |
+----+--------+
|  1 |  12345 |
+----+--------+

Или

DECLARE @Out VARCHAR(5);

EXECUTE sp_executesql   
        N'SELECT @Out = @Var',
        N'@Var VARCHAR(5) , @Out VARCHAR(5) OUTPUT',
        @Var = '12345',
        @Out = @Out OUTPUT;

SELECT @Out As Result;

Наконец, пожалуйста, не забудьте посетить sp_executesql

0 голосов
/ 10 октября 2018

Переменная имеет область видимости только в том пакете, в котором она находится.Когда вы запускаете динамический SQL, динамический SQL имеет другую область действия, поэтому к переменным нельзя получить доступ, если они находятся в другом.Например, оба следующих оператора сгенерируют ошибку:

DECLARE @SQL nvarchar(MAX) = N'SELECT @i;';
DECLARE @i int = 1;
EXEC (@SQL);
GO

DECLARE @SQL nvarchar(MAX) = N'DECLARE @i int = 1;';
EXEC (@SQL);
SELECT @i;
GO

Если вы используете динамический SQL, вам необходимо передать детали любых переменных в качестве параметров, используя sp_executesql.Например:

DECLARE @SQL nvarchar(MAX) = N'SELECT @n;';
DECLARE @i int = 1;
EXEC sp_executesql @SQL, N'@n int', @n = @i;

Если вы хотите, чтобы возвращаемые скалярные значения были переменными, используйте параметр OUTPUT (лично я рекомендую использовать синтаксис {Variable} = EXEC {Expression/Stored Procedure}, поэтому одна из причин заключается в том, что вы ограничены однимскалярное значение).

Итак, еще раз, как пример:

DECLARE @SQL nvarchar(MAX) = N'SET @a =  @n + 1;';
DECLARE @i int = 1, @b int;
EXEC sp_executesql @SQL, N'@n int, @a int OUTPUT', @n = @i, @a = @b OUTPUT;
PRINT @b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...