Причина этой ошибки ( Должна объявить скалярную переменную «@ 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'