SQL Server 2012错误:必须声明标量变量@lcrcolumn_total

时间:2016-02-04 13:23:44

标签: sql-server sql-server-2012

这是我在Dynamic SQL中的第一个项目。

当我运行以下查询时。我收到了一个错误:

  

必须声明标量变量“

虽然我预先声明了变量for i = 1:10, A(i,b(i)) = A(i, b(i)) - 1; end;

sonata_type_admin

提前致谢!!!

2 个答案:

答案 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

说明:

  1. 添加WHERE条件,否则您将更新所有行
  2. 使用sp_executesql代替EXEC
  3. 使用正确的数据类型
  4. 传递变量@lcrcolumn_total
  5. 在替换column_name
  6. 时,使用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()处理这些名称。