Aber gerne doch.
bcp kommt als Teil der SQL Server-Tools, ich weiss nicht, ob man diese irgendwo einzeln oder im Paket herunterladen kann - beim SQL Server 2005 werden sie jedenfalls standardmässig mitinstalliert, und das Programm liegt im Verzeichnis
C:\Programme\Microsoft SQL Server\90\Tools\Binn.
Support zu bcp:
(Du musst Dich Einloggen oder Registrieren um Multimediadateien oder Links zu sehen).Zunächst habe ich im SQL Server Manager die Namen aller Tabellen in der SUSDB ausgeben lassen:
select name from SUSDB..sysobjects where xtype = 'U';
Das Ergebnis habe ich in die Datei "tabellen.txt" kopiert (s. Anhang), Ausschnitt:
tbAuthorization
tbAutoDeploymentRule
tbBundleAll
tbBundleAtLeastOne
Nun müsste ich für jede Tabelle einzeln das bcp-Kommando ausführen. Da ich aber faul bin, habe ich dafür eine kleine Batchdatei geschrieben (export.bat, muss im gleichen Ordner wie die tabellen.txt liegen):
@ECHO OFF
FOR /F %%a IN (tabellen.txt) DO (
bcp SUSDB..%%a out %%a -S SERVERNAME -U BENUTZERNAME -P PASSWORT -n
)
In der Datei muss ersetzt werden:
- SERVERNAME -> der Hostname des SQL-Servers
- BENUTZERNAME -> ein gültiger Benutzername auf dem SQL-Server, der auf die Datenbank SUSDB zugreifen darf
- PASSWORT -> das dazugehörige Passwort
Anmerkung: unser SQL-Server nutzt die SQL-Server-Authentifizierung, d.h. die integrierte Benutzerdatenbank des SQL-Servers. Ist der SQL-Server auf Windows-Authentifizierung eingestellt und hat der Windows-Account, unter dem die Batchdatei gestartet wird, Zugriff auf die SUSDB, so kann man statt Benutzer und Passwort einfach die Option -T nutzen, was dann so aussieht:
bcp SUSDB..%%a out %%a -S SERVERNAME -T -n
Egal welche Authentifizierung man nutzt, die Batchdatei tut folgendes: sie liest die "tabellen.txt" ein und führt für jede Zeile (also jeden Tabellennamen) das bcp-Kommando aus, welches die entsprechende Tabelle aus der Datenbank exportiert und im aktuellen Verzeichnis speichert. Die Option "-n" ist wichtig, damit der Datentyp der Spalten korrekt exportiert wird.
Anschliessend hat man also 106 Tabellen im aktuellen Verzeichnis liegen. Der Export dauert lange, besonders die letzte Tabelle (tbXml) ist sehr gross. Ich würde empfehlen, die Ausgabe der Batchdatei in eine Logdatei umzuleiten, damit man später nach Fehlern suchen oder nachlesen kann:
C:\Temp\wsusexport> export.bat >>export_log.txt
Die neue Datenbank in der WID muss zunächst geleert werden, bevor der Import gestartet werden kann. Hier habe ich (brachial!) einfach alle Tabellen geleert. Dabei gibt es Probleme mit den Constraints; das macht aber nichts, ich habe die angehängten Skripte (EDIT: siehe nächstes Posting) einfach wechselseitig so oft ausgeführt, bis alle Tabellen leer waren. Ja, das ist brachial und geht bestimmt auch eleganter.
Achtet darauf, wenn ihr diese Skripte ausführt, dass ihr in der richtigen Datenbank seid!Um die Tabellen anschliessend in die neue (geleerte) Datenbank innerhalb der Windows Internal Database zu importieren, nutze ich eine ähnliche Batchdatei (import.bat):
@ECHO OFF
FOR /F %%a IN (tabellen.txt) DO (
echo --- Importiere Tabelle %%a ---
bcp SUSDB..%%a in %%a -S \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query -T -n -q -k -E
echo --- Tabelle %%a fertig importiert ---
)
Als Servername wird nun der Name der WID genutzt, und da diese nur lokal verfügbar ist, muss die Batchdatei auf dem Server gestartet werden, auf dem die WID läuft. Da die WID nur die Windows-Authentifizierung kennt, muss hier mit -T gearbeitet werden. Die anderen Optionen müssen gesetzt werden, damit die Daten problemlos importiert werden können: -n übernimmt den Datentyp der Spalten korrekt, -q aktiviert "Quoted Identifiers", was für einige Tabellen benötigt wird, -k importiert auch NULL-Werte so, wie sie in der Original-Datenbank waren, und -E sorgt für die richtigen Identitätswerte.
(Siehe bcp-Supportseite für eine ausführlichere Beschreibung)
Am Besten loggt ihr auch den Import mit:
C:\Temp\wsusexport> import.bat >>import_log.txt
Nun sind alle Daten aus der SQL-Datenbank erfolgreich in die WID importiert worden.