任何人都可以查看我的陈述......
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
必须声明表变量“@tblName”。
答案 0 :(得分:12)
您的@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%'''
有关新sys
架构中可用内容以及如何充分利用它的更多信息,请参阅MSDN: Querying the SQL Server System Catalog。
正如“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
才能确定才能获得单个值 - 否则此语句可能会失败(如果选择了多行)。
答案 1 :(得分:6)
不确定你想要做什么,但我认为你想要这样的事情:
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)
话虽如此,这里还有一些值得注意的事情。您需要处理SELECT DISTINCT
返回除单个记录之外的任何内容的情况。另外,当@strSQL
始终具有相同的值(因为@tblName
子句中没有使用变量)时,我真的不明白需要构建动态SQL(在WHERE
中)