这是我想做的事。
对于其表名为'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
答案 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函数可能会执行您想要的操作。我不确定它是否适用于链接数据库......但是网络搜索可能会有所改变。