任何人都可以检查我的声明…
DECLARE @tblName varchar(MAX),@strsql varchar(MAX) SET @tblName ='SELECT DISTINCT o.name as TableName FROM sysobjects o JOIN sysindexes x on o.id = x.id WHERE o.name LIKE ''%empty%''' SET @strsql = 'INSERT INTO @tblName VALUES(''trylng'',''1'')' EXEC (@strsql)
我的错误是…
Msg 1087,Level 15,State 2,Line 1
Must declare the table variable “@tblName”.
解决方法
您的@tblName属性存在于外部范围 – “正常”代码行的范围 – 但不在您正在构造的字符串中的sql的内部范围.
你需要改变你的行:
SET @strsql = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'',''1'')'
然后它应该工作正常.
此外,您没有提到您的sql Server版本 – 但是从sql Server 2005或更新版本开始,您应该停止使用sysobjects和sysindexes,而应使用包含或多或少相同信息的新的sys架构,但更容易使用.将您的查询更改为:
SET @tblName ='SELECT DISTINCT t.name as TableName FROM sys.tables t INNER JOIN sys.indexes i on i.object_id = t.object_id WHERE t.name LIKE ''%empty%'''
请参阅MSDN: Querying the SQL Server System Catalog有关新的sys模式中可用的更多信息以及如何充分利用它!
正如“rsbarro”所指出的那样:将这个sql语句放在引号中是奇怪的 – 你是否也使用EXEC(…)执行这个语句?但是,如何将值重新分配给@tblName属性?真的没有意义…..
SELECT TOP 1 @tblName = t.name FROM sys.tables t INNER JOIN sys.indexes i on i.object_id = t.object_id WHERE t.name LIKE '%empty%'
你需要有一个TOP 1,以确保只得到一个单一的值 – 否则这个语句可能会失败(如果选择了多个行).