2009-07-10 2 views
1

Hier ist, was Ich mag würde tunSQL Server - Ein Skript eine Schleife durch alle entfernten Tabellen und führen Sie „Select * in ...‚

Für jede Tabelle in linkedserver.database deren Tabellenname ist wie.‘Text %‘

(Looping)

A. Wenn current_table lokal vorhanden ist, löschen sie

B. select * in table.name (local) aus linkedserver.tablename (kopieren Schema + Daten)

C. Möglicherweise auf Fehler prüfen und einen Text darüber drucken?

Weiter

Jede Idee, wenn dieses Skript möglich ist? Ich bin sehr ahnungslos mit Tabellennamen zu arbeiten, wenn es um

select * into @Variable_Storing_Table_Name 
from [email protected]_Storing_Table_Name 
+0

Ü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. –

Antwort

3

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.

+2

Sieht gut aus, aber denken Sie daran, dass Tabellennamen möglicherweise zitiert werden müssen. Sie können Leerzeichen oder eckige Klammern enthalten, die das dynamische SQL hier unterbrechen könnten. Ändern Sie das dynamische SQL, um die Funktion Zitatname zu verwenden: sp_executesql N'drop table '+ QuoteName (@local_table); –

+0

@Chris: Großartiger Vorschlag. Ich habe noch nie von QuoteName gehört, also danke für den Tipp. – Eric

+0

Eric, Wäre es möglich, nach einem Fehlerfall um Ihre "print @link_table + 'kopierte" Zeile zu suchen? Wenn ich mich wie ein Amateur anhört ... nun ... bin ich –

0

möglich wäre Es ist eine nicht dokumentierte SQL Server-Funktion aufgerufen sp_foreachtable, die möglicherweise tun, was Sie wollen. Ich bin mir nicht sicher, ob es in verknüpften Datenbanken funktioniert ... eine Websuche könnte etwas aus der Ruhe bringen.

Verwandte Themen