Nun, hier ist, wie dies ein cursor
mit tun:
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
Während Cursor sollten generell vermieden werden, hier suchen Sie eine Menge Logik hinter jeder und jede Zeile zu tun. Hier ist es also. Es greift auf alle verknüpften Tabellen zu und gleicht alle lokalen Tabellen mit denen ab, oder null
, wenn die lokale Tabelle nicht existiert. Dies platziert es in eine cursor
, die wir verwenden können, um durch das Rowset zu durchlaufen.
Der fetch next
Befehl die nächste Zeile aus unserem cursor
packt und dann gilt die Logik, um es (drop
es, wenn die lokale Tabelle vorhanden ist, dann tun ein select * into...
).
Sie können Fehler auf eine von zwei Arten erfassen. Ich benutzte den try...catch
Block, aber Sie können auch überprüfen @@ERROR
und sehen, ob es nicht gleich Null ist. Wirklich, was auch immer du am wohlsten fühlst.
Als Haftungsausschluss für die Anti-Cursor-Menge: Cursor sind nicht böse, sie werden nur oft falsch verwendet.
Übrigens, falls es nicht klar war ... der Grund, warum ich dies tun möchte, ist nur Abschnitte aus einer sehr großen Datenbank zu extrahieren, die sich stark entwickelt. –