Sql server 如何使用Sql字符串为变量赋值

Sql server 如何使用Sql字符串为变量赋值,sql-server,sql-server-2008-r2,dynamic-sql,Sql Server,Sql Server 2008 R2,Dynamic Sql,我想使用sql字符串为变量分配一个select值。下面是我的代码: DECLARE @maxRow INT, @tableName NVARCHAR(128) = N'whatever'; select @maxRow=Max(id) from @tableName 但这带来了一个错误: Msg 1087,16级,状态1,第3行 必须声明表变量“@tableName” 即使我声明了变量。除非将变量放入动态SQL中,否则不能将其用作表名。代码当前希望@tableName是一个表变量,而不是一个

我想使用sql字符串为变量分配一个select值。下面是我的代码:

DECLARE @maxRow INT, @tableName NVARCHAR(128) = N'whatever';

select @maxRow=Max(id) from @tableName
但这带来了一个错误:

Msg 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注入和规范化