首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL声明变量

SQL声明变量
EN

Stack Overflow用户
提问于 2012-02-23 13:31:03
回答 2查看 62.1K关注 0票数 16

有人能检查一下我的陈述吗..。

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)

我的错误是..。

消息1087,级别15,状态2,第1行

必须声明表变量“@tblName”。

EN

回答 2

Stack Overflow用户

发布于 2012-02-23 13:48:56

你的@tblName属性存在于外部作用域--你的“普通”代码行的作用域--而不是你在那里的字符串中构造的SQL的内部作用域。

您需要将您的代码行改为:

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')'

然后它应该会工作得很好。

此外,您没有提到您的SQL Server版本-但是从SQL Server2005或更高版本开始,您应该停止使用sysobjectssysindexes -而是使用包含或多或少相同信息的新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来确保只获得一个值-否则这个语句可能会失败(如果选择了多个行)。

票数 12
EN

Stack Overflow用户

发布于 2012-02-23 13:44:54

我不确定你到底想做什么,但我认为你想要这样的东西:

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返回单个记录以外的任何内容的情况。而且,当@tblName总是具有相同的值时(因为WHERE子句中没有使用变量),我真的不理解构建动态SQL (在@strSQL中)的必要性。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9407703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档