SQL Server - 循环遍历所有远程表并执行“S​​elect * into ...”的脚本

时间:2009-07-10 20:10:36

标签: sql sql-server sql-server-2005 select

这是我想做的事。

对于其表名为'text%'

的linkedserver.database中的每个表

(内循环)

  

一个。如果current_table存在于本地,请将其删除

     

B中。从linkedserver.tablename中选择* into table.name(local)(copy   架构+数据)

     

℃。可能检查错误并打印一些关于它的文本?

下一步

知道这个脚本是否可行?如果有可能

,我对使用表名非常无能为力
select * into @Variable_Storing_Table_Name 
from LinkedServer.DB.@Variable_Storing_Table_Name

2 个答案:

答案 0 :(得分:3)

嗯,这是使用cursor

执行此操作的方法
use database
go

declare @link_table nvarchar(255)
declare @local_table nvarchar(255)

declare table_list cursor for
select
    tlink.name,
    tlocal.name
from
    linkedserver.database.sys.tables tlink
    left outer join sys.tables tlocal on
        tlink.name = tlocal.name

open table_list

fetch next from table_list into @link_table, @local_table

while @@FETCH_STATUS = 0
begin
    begin try
        if @local_table is not null
        begin
            sp_executesql N'drop table ' + quotename(@local_table)
        end

        sp_executesql N'select * into ' + quotename(@link_table) +
            ' from linkedserver.database..' + quotename(@link_table)
        print @link_table + ' copied.'
    end try
    begin catch    
        print 'Error: ' + ERROR_MESSAGE()
    end catch

    fetch next from table_list into @link_table, @local_table
end

close table_list
deallocate table_list

虽然通常应该避免使用游标,但是在这里你需要在每一行背后做很多逻辑。所以,在这里。它的作用是获取所有链接表并将任何本地表与这些表匹配,或者如果本地表不存在则匹配null。这将它放在cursor中,我们可以使用它来遍历行集。

fetch next命令从我们的cursor抓取下一行,然后将逻辑应用于它(drop如果本地表存在,则执行select * into...

您可以通过两种方式捕获错误。我使用了try...catch块,但您也可以检查@@ERROR并查看它是否不等于零。真的,无论你感觉最舒服。

作为反光游戏人群的免责声明:光标不是邪恶的,它们经常被不恰当地使用。

答案 1 :(得分:0)

有一个名为sp_foreachtable的未记录的SQL Server函数可能会执行您想要的操作。我不确定它是否适用于链接数据库......但是网络搜索可能会有所改变。