SQL声明变量

前端之家收集整理的这篇文章主要介绍了SQL声明变量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
任何人都可以检查我的声明…
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,以确保只得到一个单一的值 – 否则这个语句可能会失败(如果选择了多个行).

猜你在找的MsSQL相关文章