Динамическая передача переменных в sp_executesql - PullRequest
2 голосов
/ 09 июля 2020

У меня есть требование, когда набор переменных уже инициализирован некоторыми значениями по умолчанию и используется для других целей. Теперь я пытаюсь передать несколько переменных динамически, обычно запрашиваю переменные из другой таблицы и перехожу к оператору select.

Я не хочу сейчас использовать все переменные. Количество параметров может время от времени меняться.

Когда я пытаюсь реализовать описанным ниже способом, я получаю переменную, которая не определена.

Ниже приведен фрагмент кода примера, который напоминает logi c.

DECLARE @i_int1 INTEGER = 1
    ,@i_int2 INTEGER = 2
    ,@i_int3 INTEGER = 3
    ,@i_int4 INTEGER = 4
    ,@i_int5 INTEGER = 5
    ,@i_int6 INTEGER = 6
    ,@sql NVARCHAR(max) = ''
    ,@vcOutput NVARCHAR(max) = ''

BEGIN
    --set @vcOutput = CAST(@i_int1 AS nvarchar(MAX)) +','+ CAST(@i_int2 AS nvarchar(MAX))
    SET @vcOutput = '@i_int1,@i_int2'
    SET @sql = 'select ' + @vcOutput

    EXECUTE sp_executesql @sql;
END

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Вы можете попробовать следующий запрос.

DECLARE @i_int1 INTEGER = 1
    ,@i_int2 INTEGER = 2
    ,@i_int3 INTEGER = 3
    ,@i_int4 INTEGER = 4
    ,@i_int5 INTEGER = 5
    ,@i_int6 INTEGER = 6
    ,@sql NVARCHAR(max) = ''
    ,@vcOutput NVARCHAR(max) = ''

BEGIN
    --set @vcOutput = CAST(@i_int1 AS nvarchar(MAX)) +','+ CAST(@i_int2 AS nvarchar(MAX))
    SET @vcOutput = Convert(Varchar(10), @i_int1) + ',' + Convert(Varchar(10), @i_int2)
    SET @sql = 'select ' + @vcOutput

    --select @sql
    exec(@sql);
END

Live Demo

0 голосов
/ 09 июля 2020

Причина этой ошибки ( Должна объявить скалярную переменную «@ i_int1». ) заключается в том, что sp_executesql ожидает в качестве параметров определения всех параметров, встроенных в оператор, и их фактические значения. . Итак, вам необходимо передать определения и фактические значения для каждого из определенных параметров. Обратите внимание, что вы можете определить все возможные переменные как параметры, но не использовать все переменные в инструкции.

DECLARE 
    @i_int1 int = 1
   ,@i_int2 int = 2
   ,@i_int3 int = 3
   ,@i_int4 int = 4
   ,@i_int5 int = 5
   ,@i_int6 int = 6
   ,@sql nvarchar(max) = ''
   ,@rc int

SET @sql = 'SELECT @i_int1, @i_int2'
EXEC @rc = sp_executesql 
   @sql, 
   N'@i_int1 int, @i_int2 int, @i_int3 int, @i_int4 int, @i_int5 int, @i_int6 int', 
   @i_int1, @i_int2, @i_int3, @i_int4, @i_int5, @i_int6

IF @rc = 0 PRINT 'OK'
ELSE PRINT 'Error'

Если имена переменных хранятся в таблице (и если я правильно понимаю ваш вопрос) , вы можете попробовать сгенерировать оператор динамически:

CREATE TABLE Variables (Name nvarchar(128))
INSERT INTO Variables (Name) 
VALUES ('@i_int1'),('@i_int2')

DECLARE 
    @i_int1 int = 1
   ,@i_int2 int = 2
   ,@i_int3 int = 3
   ,@i_int4 int = 4
   ,@i_int5 int = 5
   ,@i_int6 int = 6
   ,@sql nvarchar(max) = ''
   ,@rc int

SET @sql = CONCAT(
   N'SELECT',
   STUFF((SELECT CONCAT(', ', Name) FROM Variables FOR XML PATH('')), 1, 1, N'')
)

EXEC @rc = sp_executesql 
   @sql, 
   N'@i_int1 int, @i_int2 int, @i_int3 int, @i_int4 int, @i_int5 int, @i_int6 int', 
   @i_int1, @i_int2, @i_int3, @i_int4, @i_int5, @i_int6

IF @rc = 0 PRINT 'OK'
ELSE PRINT 'Error'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...