SQL声明变量

Arg*_*eph 16 sql t-sql sql-server variables

任何人都可以查看我的陈述......

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)
Run Code Online (Sandbox Code Playgroud)

我的错误是......

消息1087,级别15,状态2,行1
必须声明表变量"@tblName".

mar*_*c_s 12

您的@tblName属性存在于外部作用域 - "正常"代码行的作用域 - 但不在您在字符串中构造的SQL的内部作用域....

您需要将行更改为:

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')'
Run Code Online (Sandbox Code Playgroud)

然后它应该工作得很好.

此外,你不提你的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%'''  
Run Code Online (Sandbox Code Playgroud)

请参阅MSDN:查询SQL Server系统目录以获取有关新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%'
Run Code Online (Sandbox Code Playgroud)

你需要TOP 1在那里确保只获得一个值 - 否则这个语句可能会失败(如果选择多行).


rsb*_*rro 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)
Run Code Online (Sandbox Code Playgroud)

话虽如此,这里还有一些值得注意的事情.您需要处理SELECT DISTINCT返回除单个记录之外的任何内容的条件.另外,我并不真正理解构建动态SQL(in @strSQL)的必要性,@tblName因为它总是具有相同的值(因为WHERE子句中没有使用变量).