atwork.blog

news and infos about microsoft, technology, cloud and more

Tabellen in SQL Server vergleichen - Tablediff.exe

Arbeiten Sie viel mit SQL-Datenbanken? Dann kennen Sie (oder hatten Sie) sicher die Anforderung, Daten aus einer Datenbank (gescriptet) in eine andere Datenbank zu transferieren und dabei nur die Änderungen zu übertragen. Das lässt sich mit mehreren Methoden bewerkstelligen, je nach Anforderung, Know How und technischer Umgebung - vom SSIS Import-Tool über selbst scripten bis hin zu kostenpflichtigen Tools und Backup und Restore oder DB-Mirroring (dazu später mal mehr in einem eigenen Artikel). Ich hatte vor kurzem einen solchen Fall. Die Quell-Datenbank ist viele GB groß und es sollten nur Inhalte aus einer Tabelle in eine andere Test-Datenbank übertragen werden. In der Quell-Tabelle wurden Datensätze aktualisiert, gelöscht und hinzugefügt. In der Ziel-Tabelle in einer zweiten Datenbank sind manche Datensätze bereits vorhanden und sollen durch die Quell-Tabelle aktualisiert werden. Und das Ganze Aktualisieren (weils ja eine Testdatenbank ist, die sich immer wieder ändert) soll oftmals durchgeführt werden können. Also am besten irgendwie scripten... Fesch. Wie sag ichs meinem Computer - sprich SQL Server? Genau dafür gibt es seit SQL Server 2005 ein kleines Kommandozeilen-Tool - das allerdings wenig bekannt (wie das mit vielen Command Line-Tools so der Fall ist) und sehr praktisch ist: TableDiff "The tablediff utility is used to compare the data in two tables for non-convergence, and is particularly useful for troubleshooting non-convergence in a replication topology." Das klingt mal interessant. Und TableDiff macht auch genau das: Es vergleicht Tabellen und kann auch ein Script mit den Unterschieden der Tabelleninhalte erstellen um die Änderungen auf einem Zielsystem sofort ausführen zu können. Es "synchronisiert" allerdings nicht die Unterschiede aus beiden Tabellen, sondern nur in eine Richtung - wie in der Grafik oben. In meiner Anforderung ist TableDiff super-fein, denn das kleine Script (im Vergleich zur mehreren GB großen Datenbank) kann auch sehr rasch erzeugt und auf das Zielsystem transportiert und ausgeführt werden, ohne irgendwelche erforderlichen Verbindungen oder Konfigurationen - also "straight forward". Also, wo findet man TableDiff.exe? Bei SQL Server 2008 hier: C:\Program Files\Microsoft SQL Server\100\COM Der Pfad zu TableDiff.exe in SQL Server 2005 lautet übrigens "Program Files\Microsoft SQL Server\90\COM". Wie funktioniert es und wie sieht der Aufruf aus? tablediff.exe -sourceserver server1 -sourcedatabase db1 -sourcetable table1 -destinationserver server1 -destinationdatabase db2 -destinationtable table2 Hinweis: Um explizite Credentials zum SQL Server anzugeben sind diese Parameter erforderlich: -sourceuser <SourceLogin> -sourcepassword <SourcePassword> bzw. -destinationuser <DestinationLogin> -destinationpassword <DestinationPassword> Hinweis: "To compare tables, you need SELECT ALL permissions on the table objects being compared." und "..To use the -et option, you must be a member of the db_owner fixed database role..." D.h. am besten einen dbowner o.ä. für das Tool verwenden, dann gibts keinerlei Einschränkungen. Wenn die beiden Tabellen-Schemata nicht übereinstimmen, folgt ein Hinweis: Table [db1].[dbo].[table1] on SERVER1 and Table [db2].[dbo].[table2] on SERVER1 have different schemas and cannot be compared. Eine weitere Voraussetzung: Die Tabellen müssen eine eindeutige ID-Spalte besitzen: The replication table difference tool requires the comparison tables/views to have either a primary key, identity, rowguid or unique key column. So, nun zu meinem Fall-Beispiel: Ich habe auf der SQL-Maschine "DAISY" zwei Datenbanken "db1" und "db2" und hier jeweils eine Tabelle "WEB_Node". Die Änderungen (Inhalte) von "WEB_Node" sollen aus "db1" in "db2" transportiert werden - hier sind Webinhalte gespeichert, die in die Testdatenbank transferiert werden sollen. So sieht mein kleines Script C:\Temp\SQL\doit.cmd aus: cd "C:\Program Files\Microsoft SQL Server\100\COM" tablediff -sourceserver "DAISY" -sourcedatabase "db1" -sourcetable "WEB_Node" -destinationserver "DAISY" -destinationdatabase "db2" -destinationtable "WEB_Node" -et Diff -f C:\Temp\SQL\diff.sql pause Damit wir auch sehen, WAS die Unterschiede sind, fügen wir zum Statement "-et Diff" hinzu - damit werden die Unterschiede in eine temporäre Tabelle "Diff" geschrieben und können daraus ausgegeben werden. Und noch besser: -f <pfad><sqlfile> erzeugt ein T-SQL-File, das die Änderungen scriptet! Damit können die Änderungen ganz leicht am Zielsystem "ausgeführt" werden - voila! Auch ganz praktisch: Um mal rasch einen Überblick zu erhalten, sind die Parameter -c -q gut, z.B.: Table [db1].[dbo].[WEB_Node] on DAISY and Table [db2].[dbo].[WEB_Node] on DAISY have different row counts. Table [db1].[dbo].[WEB_Node] on DAISY has 123 rows. Table [db2].[dbo].[WEB_Node] on DAISY has 101 rows. The requested operation took 0,0950095 seconds. So, lassen wir es mal (ohne -c -q) laufen: Naja, da sind schon einige Unterschiede vorhanden. Das erzeugte File diff.sql sieht dann in meinem Fall so aus: Das File ist laang, am Ende folgen dann die neuen Datensätze (INSERTS). Achja, eines sollte ich noch im Script anpassen: Dass die Änderungen in die "richtige" Datenbank geschrieben werden - bei mir in "db2" - der Hinweis steht zwar im Script, aber nur als Kommentar. Also am Beginn ergänzen: use db2 go So, F5 (Run) drücken - here we go. Voller Spannung erwarte ich, dass SQL Server nun die ganze Arbeit erledigt ... FAIL! Es gibt einen "Converting error" beim Umwandeln von Datentypen. Erste Analyse: Das erste INSERT Command will in ein Feld vom Typ smalldatetime einen Datumswert als String N'Null' (also kein Datum vorhanden) einfügen... Dass das nicht klappen kann erscheint logisch. Also im Script mit Suchen und Ersetzen workaround-en: Ersetze alle Vorkommen von N'NULL' durch NULL: Alles ersetzen. Achja und noch ein zweiter Stolperstein: Das verwendete Datumsformat N'2010-08-12 10:38:00' war auf meinem SQL Ziel-System auch noch ein Problem. Also auch zu Beginn das Datumsformat setzen: set dateformat ymd; RUN! Jipee, es funktioniert jetzt brav, frei nach dem Motto "Kaum macht mans richtig, gehts...". Noch ein Tipp: Der zusätzlichen Parameter -strict kann auch bei der Fehleranalyse helfen (Source and destination schema are strictly compared). Das Scripten eines NULL-Datum ist mein einziger Wehrmutstropfen am coolen tablediff-Tool: Einen Parameter zum Ändern des N'NULL' Verhaltens habe ich bislang nicht gefunden. Vielleicht hat ja ein Leser einen Tipp? Nun gut, aber der Workaround mit Search & Replace tuts auch - wenn man es weiß. ;-) Noch ein Tipp zum Vergleichen von GROSSEN Tabellen: Der Parameter -bf <number_of_statements> schränkt die Anzahl der Befehle auf die angegebene Anzahl ein und erzeugt danach ein neues, weiteres File. Damit sind große Update-Scripts durchführbar und bearbeitbar. Weitere Links zu tablediff: http://msdn.microsoft.com/en-us/library/ms162843.aspx - tablediff Utility http://msdn.microsoft.com/en-us/library/ms147919.aspx - How to: Compare Replicated Tables for Differences (Replication Programming) http://technet.microsoft.com/en-us/library/cc917696.aspx - Top 10 Hidden Gems in SQL Server 2005 http://www.databasejournal.com/features/mssql/article.php/3594926/SQL-Server-2005-TableDiff-Utility.htm - SQL Server 2005 TableDiff Utility http://sqlserverpedia.com/blog/sql-server-2005/where-do-i-find-the-tablediffexe-tool-and-what-is-it/ - Where do I find the table.diff.exe tool and what is it? http://www.mssqltips.com/tip.asp?tip=1073 - SQL Server 2005 tablediff command line utility Meine Empfehlung: TableDiff ist ein äußerst hilfreiches Tool zum automatisierten (bzw. mit dem Search & Replace Workaround halbautomatisierten) Abgleich von Tabellen und kann DB-Admins viel Zeit und Arbeit abnehmen!

Microsoft SQL Server 2008 R2 Report Builder 3.0

...ist seit gestern zum im Microsoft Download Center verfügbar: Microsoft SQL Server 2008 R2 Report Builder 3.0 "Microsoft SQL Server 2008 R2 Report Builder 3.0 ist eine Berichterstellungsumgebung für Geschäftsbenutzer, die in der vertrauten Microsoft Office-Umgebung arbeiten können, um Auswertungen rasch und einfach selbst zu erstellen." Der Download ist ein stand-alone Installer und 31MB klein. Was ist neu? Nun, zum Beispiel hinterlegbare Karten (Beispiel unten), Sparklines (die Wellengrafik "2004 Verkaufsverlauf" unten) und zusätzliche Diagrammtypen. Reports werden rascher aufgebaut (cached datasets), Auswertungen sind mit dem neuen Report Builder rascher bearbeitbar und können als Datafeed ausgegeben werden. Der Link What's New in Report Builder 3.0 August CTP informiert darüber - auch wenn der Titel nicht ganz aktuell ist, sind hier die wesentlichen Funktionen aufgelistet. Erste Schritte mit Berichts-Generator 3.0 ist eine gute Startseite um die Funktionalität und Möglichkeiten des Microsoft SQL Server 2008 R2 Report Builder 3.0 kennenzulernen. Demo eines erzeugten Reports mit Karte. Mehr Infos zu Geschäftsdaten mit geografischem Hintergrund siehe Karten (Berichts-Generator 3.0). Business Intelligence für Power-User!

SQL Server 2008 R2 ist RTM

Der nächste RTM: SQL Server 2008 R2 ist fertig, schreibt Ted Kummert, Senior Vice President, Business Platform Division, im Official Microsoft Blog: SQL Server 2008 R2: Helping Customers Get More Value Out of Their Data. (Georg kann also den SQL Server 2008 R2 in seinem Artikel RTM, RTM, RTM zur Liste der neuen, fertigen Produkte hinzufügen. ;-) Der R2 Server hat übrigens "Großes" vor: Verbesserungen in der Skalierbarkeit (256 CPU´s, Application and Multi-Server Management, etc.) und Business Intelligence in Verbindung mit SharePoint 2010 (RTM) und Office 2010 (RTM) als neue "self-service business intelligence" sind nur einige der neuen Themen, siehe auch Download the SQL Server 2008 R2 Guide. Wann wird SQL Server 2008 R2 downloadbar sein? Laut Blog wird R2 ab 3. Mai in den Microsoft Partner Bereichen msdn und technet downloadbar sein, und ab dem 13. Mai allgemein verfügbar sein. In der Microsoft SQL Server 2008 R2 Digital Tour finden sich viele der Neuigkeiten inkl. "Test Drive" im Überblick! Schauen Sie mal rein: www.sqlserverlaunch.com!

SQL Server 2008 R2 Launch

SQL Server 2008 R2 (Codename "Kilimanjaro") wird am 21. April offiziell präsentiert: SQL Server 2008 R2 Launch. Microsoft startet die "Launch Tour for SQL Server 2008 R2" gemeinsam mit der European PASS Conference (Professional Association for SQL Server). Die PASS Conference findet in Neuss, Deutschland, von 21 bis 23. April statt. Ein Termin für alle SQL-Profis! Weitere Informationen zur neuen Version finden sich SQL Server 2008 R2 Website.

Neues SQL Server 2008 R2 Developers Training Kit Update

Bald kommt sie, die finale Version SQL Server 2008 R2. Mit SQL Server 2008 sind eine Reihe von Neuerungen und Funktionen ein hergekommen. Derzeit ist noch die SQL Server 2008 R2 November CTP aktuell und hier sind auch schon die endgültigen neuen R2-Funktionen vorhanden. Im SQL Server 2008 R2 Developers Training Kit Update sind (wirklich) viele Präsentationen, Demos, Hand-On-Labs und Videos enthalten, vom Überblick der R2-Neuerungen über Neues in den Reporting Services bis hin zu StreamInsight Themen. R2 Developers Training Kit Update Wer sollte dieses Kit ansehen? Alle Developer! "The SQL Server 2008 R2 Update for Developers Training Kit is ideal for developers who want to understand how to take advantage of the key improvements introduced in SQL Server 2008 and SQL Server 2008 R2 in their applications, as well as for developers who are new to SQL Server." Hier gehts zum Überblick und Download des SQL Server 2008 R2 Developers Training Kit Update (March 2010 Update 2).

Wie bekomme ich binäre Dokumente (BLOBs) in den SQL Server?

Zu Artikel Teil Eins - Wie bekomme ich binäre Dokumente (BLOBs) aus dem SQL Server? - nun das Gegenstück: Teil Zwei - Wie kann ich Dateien IN den SQL Server bringen? Das heißt Files als BLOB (Binary Large Object) in eine Tabelle speichern - und das Ganze möglichst einfach. Diese Lösung ist ebenfalls mit T-SQL zu bewerkstelligen. Die Idee dazu ist von databasejournal.com - Storing Images and BLOB files in SQL Server Part 2 entnommen, hier das Script: (Das ganze Script gibt es hier zum Download, es läuft in SQL Server 2005 und 2008.) Das Einlesen eines Files wird wieder in einer Stored Procedure "savefromfile" gemerkt. Den gewünschten Filestream liefert OPENROWSET (Zeile 11, die Hilfe informiert: ...also supports bulk operations through a built-in BULK provider that enables data from a file to be read and returned as a rowset). Damit wird das File eingelesen. Das INSERT (Zeile 9) fügt einfach den Output des SELECTS (Zeile 10-11) in die Tabelle "MyFiles" ein. Also simpel. Screenshot der Original-Tabelle: hier. Nach dem Starten von "exec savefromfile" und Anzeigen der Tabelle  sieht das Ergebnis so aus: Das File "00006_Bild 1.jpg" wurde mit seinem Inhalt in die Tabelle MyFiles eingefügt. Fertig! Noch ein Tipp für "Massen-Imports" - wenn mehrere Dateien so in die Datenbank insertiert werden sollen: Hier kann man sich sehr rasch damit behelfen, in der Kommandozeile im Bilder-Verzeichnis die Dateinamen mit dir /w > import.txt in ein Textfile zu schreiben. Das Textfile "import.txt" dann mit Notepad öffnen, und die Dateinamen per Zwischenablage in eine neue Excel-Datei kopieren. In Excel werden die SQL-Befehle für die gewünschten Files zusammengebaut, beispielsweise so: Die Bildnamen stehen in Spalte A, in Spalte B wurde - wenn z.B. die ID aus dem Dateinamen weiterverwendet werden soll - diese aus dem Dateinamen extrahiert (B1: =LINKS(A1;5) ). Die "Formel" für Zelle C1: ="INSERT INTO MyFiles (FIL_ID, FIL_FileName, FIL_Content) SELECT " & WERT(B1) & ", '" & A1 & "', BulkColumn FROM OPENROWSET(Bulk 'D:\Temp\bin\" & A1 & "', SINGLE_BLOB) AS BLOB);" Die Formel ergibt dann das korrekte T-SQL-Statement für die jeweilige Datei: INSERT INTO MyFiles (FIL_ID, FIL_FileName, FIL_Content) SELECT 6, '00006_Bild 1.jpg', BulkColumn FROM OPENROWSET(Bulk 'D:\Temp\bin\00006_Bild 1.jpg', SINGLE_BLOB) AS BLOB); Nun Zelle C1 bis ans Ende der Dateinamen "ausfüllen" lassen: Und die so erzeugten SQLs per Zwischenablage im SQL Management Studio einfügen und laufen lassen. GO! Tipp: Excel als Hilfsmittel zum Erzeugen von SQL-Befehlen und zum Nachbearbeiten von Daten ist übrigens eine Methode, die ich wirklich oft verwende und als äußerst praktisch empfehlen kann. Viel schneller gehts kaum. ;-) Mit diesen Werkzeugen ist auch das Manipulieren von BLOBs in SQL Server rasch umsetzbar!

Wie bekomme ich binäre Dokumente (BLOBs) aus dem SQL Server?

Das Leben als Datenbank-Administrator steckt voller Überraschungen. Mal gehören Indizies erstellt oder neu aufgebaut, Volltextkataloge rebuildet, Datenbanken gebackupt, gewartet, restored und natürlich ist ein DB-Admin Ansprechpartner für alle weiteren auftretenden Probleme und Wünsche der IT und der Anwender. So hatte ich vor kurzem die Anforderung, in einer Datenbank gespeicherte Bilder "herauszuholen", also klassische BLOBs (Binary Large Objects) als Dateien zu speichern. In meiner Datenbank existiert eine Tabelle "MyFiles" mit einer Spalte vom Typ IMAGE. Das Pendant ab SQL Server 2005 wäre der "neue" Datentyp VARBINARY; in meinem Fall handelt es sich um eine konvertierte DB aus SQL 2000 in SQL 2005. In der Spalte "FIL_Content" ist der Dateistream einer Datei enthalten, z.B. JPG-Bilder, Word- und Excel-Dokumente, PDFs, (BLOB), also ganz egal welche Files (ab SQL 2008 gibt es übrigens einen eigenen Filestream-Datentyp. ;-) Die binären Dokumente können nicht simpel mit Copy & Paste herausgeholt werden, nur die entsprechende Applikation liest und schreibt die Dateien von und in die Datenbank. Diese binären Informationen aus der Tabelle sollen als Files gespeichert werden um sie weiterzuverwenden. So sieht die vereinfachte Tabelle aus, Auszulesen ist die Spalte FIL_Content: Natürlich könnte ich eine kleine .NET Applikation dafür bauen, aber ich wollte eine möglichst rasche Lösung. Und ich habe sie auch gefunden! Ein kleines T-SQL Script im SQLTeam.com Forum von "Peso". Dieses habe ich analysiert und wie folgt angepasst. (Das ganze Script gibt es hier zum Download, es läuft in SQL Server 2005 und 2008.) Ich habe das Script als Stored Procedure "save2file" angelegt. Die Funktionsweise kurz erklärt: Mit einem Cursor (Zeile 16) wird die gesamte Tabelle "MyFiles" durchlaufen und die selektierten Felder in Variablen eingelesen (Zeile 21). Dann wird der Pfad aus Feld FIL_ID und Dateiname zusammengebaut und ausgegeben (Zeile 25-28). Jetzt kommt der Clou: Es wird ein ADODB-Stream als OLE-Objekt angelegt (Zeile 30) und mit den Werten befüttert (Zeile 31 bis 34). Dieser Stream wird auf die Festplatte geschrieben (Zeile 33, 34) und das OLE Objekt zerstört (Zeile 36). Und weiter mit dem nächsten Datensatz (Zeile 38). Anzupassen ist natürlich der Pfad, wohin die Dateien gespeichert werden sollen (Zeile 27). Ausgeführt wird das Script wie gewohnt mit exec save2file Voila! Wenn alles stimmt, wurden die binary Contents als Files in den gew. Pfad extrahiert: Hinweis: Diese Vorgangsweise ist sehr rasch anwendbar, aber nicht unbedingt für "daily use" geeignet. Je nach Datenmenge ist das Erstellen eines OLE-Objekts nicht unbedingt "günstig". Aber für den Ab-und-zu Export verdient das Script meine Empfehlung als "best practice"! Eine weitere Methode: KB258038: How To Access and Modify SQL Server BLOB Data by Using the ADO Stream Object mit dem VB Beispiel "Saving the Data in a SQL Server Image Column to a File on the Hard Disk" und "Transfer the Image Stored in a .gif File to an Image Column in a SQL Server Table". In Teil Zwei geht es dann um den umgekehrten Weg - wie bekomme ich Files per T-SQL als BLOB in die Datenbank... Möge T-SQL immer so hilfreich sein! ;-) Beitrag von Toni Pohl

Die Zukunft von SQL Server...

...beginnt hier! SQL Server 2008 R2 (codename "Kilimanjaro") wird ab Mai 2010 verfügbar sein (SQL Server 2008 R2 gets an official date). An der übernächsten Version von SQL Server wird auch schon gearbeitet: Wenn man den Gerüchten Glauben schenkt - msdn blog von Dan Jones, Mitglied des SQL Server Teams und den üblichen Verdächtigen (Bloggern) -, so wird diese SQL Server Version den Codenamen "Denali" tragen - und könnte als SQL Server 2011 enden? Das SQL Server Team hat eine Vorliebe für National-Park-Namen und "Denali" (indianisch: "Der Hohe") ist mit fast 6.200 Metern der höchste Berg in Nord Amerika in Alaska und heißt offiziell Mount McKinley... Matthias Berndt (Group Program Manager Microsoft SQL Server) informiert übrigens in seinem Blog über die Zeitpläne der nächsten Releases: Microsoft SQL Server Release Services, hier die wichtigsten Termine: SQL Server 2008 SP2 wird voraussichtlich im 3. Quartal 2010 veröffentlicht. SQL Server 2005 SP4 kommt wohl im 4. Quartal 2010 und wird wahrscheinlich das letzte Service Pack für diese SQL Version sein; den "erweiterten Support" dafür wird es ab April 2011 bis Dezember 2016 geben. (Allgemeine Infos zur Lebenszeit der Microsoft Produkte finden sich in support.microsoft.com/lifecycle.) Und noch etwas Lustiges zum Abschluss: Wissen Sie, wie SQL Server _schmeckt_? Und wie schmeckt Oracle im Vergleich dazu?? Dazu hat martinidesign ein wirklich köstliches Video produziert: The DB Taste Challenge Viel Spaß!