如何直接从表中为sp_executesql分配参数值?

时间:2018-09-22 09:35:37

标签: sql-server tsql stored-procedures

我有这段代码:

print(SwimmingWithTheFishes(shark).print_return())

@ParmValues等于DECLARE @var1 int DECLARE @var1Value int = 10 DECLARE @sSQL nvarchar(max) = N'SELECT @var1 = @var1Value'; DECLARE @ParmDefinition nvarchar(max) = N'@var1 int OUTPUT, @var1Value int'; DECLARE @ParmValues varchar(max) = (select paramsValues from Table_1 where id = 1) EXEC sp_executesql N'SELECT @var1 = @var1Value', N'@var1 int OUTPUT, @var1Value int', @ParmValues

这段代码会引发从int到varchar的转换错误,但是如果直接运行赋值,并且没有表的查询,就可以正常工作。

'@var1Value = @var1Value,@var1= @var1 OUTPUT'

是否可以直接从表格中获取分配?

谢谢您的回答。

1 个答案:

答案 0 :(得分:0)

您可以使用动态SQL。从其组成部分中构建一个字符串,然后执行该字符串。

注意:字符串是在其自己的范围内执行的,因此任何引用的变量都必须出现在字符串本身中。

create table Table_1 ( ID int, paramsValues varchar(max) )

insert into Table_1 ( ID, paramsValues ) values
( 1, '@var1Value = @var1Value,@var1= @var1 OUTPUT' )

DECLARE @sSQL nvarchar(max) = N'SELECT @var1 = @var1Value';
DECLARE @ParmDefinition nvarchar(max) = N'@var1 int OUTPUT, @var1Value int';

DECLARE @ParmValues varchar(max) = (select paramsValues from Table_1 where id = 1)

declare @S nvarchar(300)

set @S =  'DECLARE @var1 int '
        + 'DECLARE @var1Value int = 10 '
        + 'EXEC sp_executesql '
        + 'N''' + @sSQL + ''','
        + 'N''' + @ParmDefinition + ''','
        + @ParmValues

exec sp_executesql @S