执行由字符串连接组成的SQL查询时出错

时间:2014-07-23 14:34:27

标签: sql sql-server sql-server-2008-r2

我正在设计SQL Server 2008 R2查询。

如果我使用字符串连接插入表中,则不起作用。

  DECLARE @s1 varchar(MAX);
  DECLARE @s2 varchar(MAX);
  DECLARE @s3 varchar(MAX);
  DECLARE @s4 varchar(MAX);

  SET @s1 = 'SELECT a.id, b.name as new_name, a.value FROM ['
  SET @s2 = '].[dbo].[table1] as a, '
  SET @s3 = 'a_temp_table as b '    -- a_temp_table is a table variable. No matter I put "@" or "#" in front of  a_temp_table, it doe snot work. 
  SET @s4 = 'WHERE a.id = b.id and a.address = b.address '

  INSERT INTO [dbo].[table2]                       **nothing is inserted** 
  EXEC(@s1 + @my_database_name + @s2 + @s3 + @s4)  **this query return nothing** 

但是,如果我不使用EXEC并且直接使用查询而没有任何字符串连接,它就可以工作。

我需要在循环中的每次迭代中访问不同的数据库,所以我更喜欢字符串连接。

这是"打印所有字符串"

的输出
INSERT INTO [dbo].[table2] 
   SELECT a.id, b.name as new_name, a.value 
   FROM [@my_database_name].[dbo].[table1] as a, a_temp_table as b 
   WHERE a.id = b.id and a.address = b.address 

如果我将其更改为:

,则有效
INSERT INTO [dbo].[table2] 
   SELECT a.id, b.name as new_name, a.value 
   FROM [@my_database_name].[dbo].[table1] as a, @a_temp_table as b 
   WHERE a.id = b.id and a.address = b.address 

但是,在字符串格式中,我收到了错误:

 Must declare the table variable "@a_temp_table".

3 个答案:

答案 0 :(得分:0)

尝试使用

declare @sqlToExec nvarchar(2000) 
set @sqlToExec = 'INSERT INTO [dbo].[table2] ' + @s1 + @my_database_name + @s2 + @s3 + @s4 
exec sp_sqlexec @sqlToExec

答案 1 :(得分:0)

试试这个:

SET @insert = 'INSERT INTO [dbo].[table2] '
SET @qry = 'SELECT a.id, b.name as new_name, a.value FROM ['
       + '].[dbo].[table1] as a, '
       + 'a_temp_table as b '
       + 'WHERE a.id = b.id and a.address = b.address '

EXEC(@insert + @qry) 

如果不起作用,请运行:

SET @insert = 'INSERT INTO [dbo].[table2] '
SET @qry = 'SELECT a.id, b.name as new_name, a.value FROM ['
       + '].[dbo].[table1] as a, '
       + 'a_temp_table as b '
       + 'WHERE a.id = b.id and a.address = b.address '

Print @insert + @qry

然后运行生成的查询以确保它的组成方式,如果需要,拆分插入并选择。

另一个测试是指定插入内的列,看看是否会产生影响。

答案 2 :(得分:0)

根据您的最新更新,问题是您如何尝试将表变量与动态SQL一起使用。

我的理解是表变量在main(静态)脚本中的某处声明(并填充),并且您希望在动态查询中使用其内容。

这不起作用,因为,作为RBarryYoung has already told you in a comment,变量(包括表变量)仅在声明它们的范围内可见,而不是在其他任何地方。特别是,它们在嵌套的EXECUTE调用中可见。

相比之下,local temporary tables 可以按您希望的方式使用。因此,将表变量替换为临时表,并在动态脚本中引用该临时表而不是@a_temp_table