加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL声明变量

发布时间:2020-12-12 16:14:27 所属栏目:MsSql教程 来源:网络整理
导读:任何人都可以检查我的声明… 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 @tb
任何人都可以检查我的声明…
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,以确保只得到一个单一的值 – 否则这个语句可能会失败(如果选择了多个行).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读