我想使用 sql 字符串将选择值分配给变量。下面是我的代码:
DECLARE @maxRow INT, @tableName NVARCHAR(128) = N'whatever';
select @maxRow=Max(id) from @tableName
但这会引发错误:
消息 1087,级别 16,状态 1,行 3
必须声明表变量“@tableName”。
即使我确实声明了变量。
我想使用 sql 字符串将选择值分配给变量。下面是我的代码:
DECLARE @maxRow INT, @tableName NVARCHAR(128) = N'whatever';
select @maxRow=Max(id) from @tableName
但这会引发错误:
消息 1087,级别 16,状态 1,行 3
必须声明表变量“@tableName”。
即使我确实声明了变量。
除非将变量放入动态 SQL 中,否则不能将变量用作表名。该代码当前期望@tableName
是一个表变量,而不是一个字符串,尽管从您的语法中可以清楚地看出这不是您想要的。这种用法闻起来像次优设计,并且会导致重大的 SQL 注入风险,但您可以尝试以下代码:
DECLARE @maxRow INT;
DECLARE @sql NVARCHAR(MAX) = N'SELECT @maxRow = MAX(id) FROM '
+ QUOTENAME(@tableName) + ';';
EXEC sp_executesql @sql, N'@maxRow INT OUTPUT', @maxRow OUTPUT;
PRINT @maxRow;
请务必阅读 SQL 注入和规范化。