T-SQL:使用"从变量"更新临时表查询

时间:2015-06-19 14:36:41

标签: sql while-loop sql-server-2012 cursor sql-update

我有一个连接到Lotus Notes数据库的链接服务器作为源。目标将是MS SQL数据库。

我有两个临时表。第一个临时表是从链接服务器中提取表名。从那里,我想为每个表做一个记录计数,并将该值存储到表名旁边的第二个临时表中。

我无法为每个表名运行循环或游标,然后使用每个表名的记录计数更新第二个临时表。

现在我收到错误"语法不正确'执行'"。 SET record_count = Execute(@sqlCommand)

Declare @DB_tables table (
table_cat varchar(1500),
table_schem varchar(1500),
table_name varchar(1500),
table_type varchar(1500),
remarks varchar(1500)
)


Declare @temp_table table (
table_name varchar(1500),
record_count varchar(255),
drop_script varchar(1500),
update_script varchar(1500)
)

--Load Initial data from linked server database
insert into @DB_Tables
exec sp_tables_ex [LINKED_SERVER_DB]

--Load table name from Stored Procedure
INSERT INTO @temp_table (table_name)
SELECT table_name from @DB_Tables 

--select * from @temp_table




--Variable to hold each table name in a loop or cursor
declare @tbl_name varchar(1500)
--declare @sqlCommand varchar(1500)


declare cur cursor for select table_name from @DB_Tables
Open cur

--Loop through each table name from the first temp table
--then update the second temp table (@temp_table) with the record count
FETCH NEXT FROM cur into @tbl_name

While @@FETCH_STATUS = 0 BEGIN

declare @sqlCommand varchar(1500)
--query used to get the record count from the frist temp table (@DB_tables)
SET @sqlCommand = 'select count(*) from '+@tbl_name

UPDATE @temp_table

SET record_count = Execute(@sqlCommand)

END
CLOSE cur
Deallocate cur



select * from @temp_table

1 个答案:

答案 0 :(得分:0)

使用执行表变量并不容易,因为动态SQL是在不同的上下文中执行的,并且没有看到变量,你无法通过这种方式分配结果。 / p>

您可以使用以下语法将结果插入表变量:

insert into @temp_table 
execute ('select ' + @tbl_name + ', count(*) from ' + @tbl_name ...)

或者使用temp。表,从那以后你也可以在动态SQL中引用它们,所以你可以做类似的事情:

create table #temp_table  (
table_name varchar(1500),
record_count varchar(255),
drop_script varchar(1500),
update_script varchar(1500)
)
...
Execute('update #temp_table set record_count = (select count(*) from '
        +@tbl_name+') where table_name = '''+@tbl_name+''')