这是我在Dynamic SQL中的第一个项目。
当我运行以下查询时。我收到了一个错误:
必须声明标量变量“
虽然我预先声明了变量for i = 1:10,
A(i,b(i)) = A(i, b(i)) - 1;
end;
。
sonata_type_admin
提前致谢!!!
答案 0 :(得分:3)
您需要将变量传递给动态SQL:
DECLARE @sql NVARCHAR(MAX) =
'UPDATE facetswrk.dbo.ODS_SUBSC_PREM_REPORT
SET @lcrcolumn_name = @lcrcolumn_total'
-- WHERE = ?; -- are you sure you want to update all rows
SET @sql = REPLACE(@sql, '@lcrcolumn_name', QUOTENAME(@lcrcolumn_name));
EXEC dbo.sp_executesql
@sql,
N'@lcrcolumn_total INT', -- set type of @lcorumn_total
@lcrcolumn_total;
的 LiveDemo
强>
说明:
WHERE
条件,否则您将更新所有行sp_executesql
代替EXEC
@lcrcolumn_total
QUOTENAME
来避免SQL注入
醇>
答案 1 :(得分:0)
如果您正在学习动态SQL,那么只需学会使用sp_executesql
,因为这是执行此类语句的最佳方式。它允许您传入和传出参数。这很重要,因为“exec”语句不与外部上下文共享变量。
代码看起来更像是这样:
DECLARE @sql nvarchar(max);
SET @sql = '
UPDATE facetswrk.dbo.ODS_SUBSC_PREM_REPORT
SET @lcrcolumn_name = @lcrcolumn_total
';
SET @sql = REPLACE(@sql, '@lcrcolumn_name', @lcrcolumn_name);
EXEC sp_executesql @sql, N'@lcrcolumn_total int', @lcrcolumn_total = @lcrcolumn_total;
请注意,您不能将列和表名称作为参数传递,因此使用REPLACE()
处理这些名称。