我正在设计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".
答案 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
。