blog.atwork.at

news and know-how about microsoft, technology, cloud and more.

Wenn in SQL Server sogar bei varchar(max) bei 8000 Zeichen Schluss ist...

Microsofts SQL Server ist fast in jedem Microsoft (Server) Produkt drin. Und auch mein Lieblings-Produkt. So habe ich im Laufe meines Berufslebens bereits von SQL Server 6.5 bis hin zum aktuellen SQL Server 2008 R2 viel Datenbank-Wartung durchgeführt und viele Lösungen entwickelt. Hierbei lernt man viel - und auch viele Stolpersteine! So hatte ich vor kurzem die Anforderung, eine Reihe von SQL Server Reports neu zu generieren. Dazu habe ich mal vor einigen Jahren ein kleines Tool geschrieben, das eine XML Datei durchläuft und alle dort enthaltenen Reports mit bestimmten Parametern als PDF File persistiert - das soll weiterverwendet werden. Nun haben sich die Reports und deren Parameter geändert und eigentlich muss ich zum Neuaufruf nur das reports.xml File neu erstellen und das Tool (sozusagen per Knopfdruck) starten und alles sollte erledigt sein. Soweit so gut, das war die Vorgeschichte. Zum Generieren des neuen XML-Files verwende ich eine einfaches, zusammengebautes Script (das ich mir zum Glück aus dem Vorjahr gemerkt habe) direkt im SQL Server 2008 R2 SQL Management Studio. Dieses durchläuft eine gejointe Tabelle und schreibt den Output in eine Textvariable @x. Das ganze Script sieht vereinfacht etwa so aus: declare @x varchar(max) set @x = '<?xml version="1.0" encoding="ISO-8859-1"?>' + char(13) + char(10) + '<reports>' + char(13) + char(10) SELECT @x = @x + '<report>' + char(13)+char(10)+ '<name>/app/betrieb</name>' + char(13)+char(10)+ '<param>format=PDF|id=' + convert(varchar,BET_ID) + '</param>' + char(13) + char(10)+ '<path>C:\temp\betrieb_'+ right('00' + convert(varchar,(ROW_NUMBER() OVER (ORDER BY Name1))),2) + '.pdf</path>' + char(13) + char(10)+ '</report>' + char(13) + char(10) FROM Betriebe LEFT OUTER JOIN Bundeslaender ON BET_BDL_ID = Bundeslaender.BDL_ID WHERE (BetriebActive = 1) ORDER BY Bundesland, Name1 set @x = @x + '</reports>' + char(13)+char(10) print @x Der so erzeugte Text in @x wird dann einfach aus dem SQL Management Studio ausgeführt (F5) und ausgegeben, für jede Tabellenzeile (bei mir etwa 30 Reports) wird ein Abschnitt "<report>" erstellt, etwa so: Der Text in Messages wird dann per Zwischenablage in ein Textfile kopiert - bzw. wird die Ausgabe direkt in ein File geschrieben "Results to File": Funktioniert ... fast!  Der Output wird irgendwo abgeschnitten! Moment mal, unsere Variable @x ist doch vom Typ varchar(max)! Damit sind doch theoretisch bis zu 2GB Zeicheninhalt möglich. Also mal nachsehen, wie lange @x tatsächlich ist: print len(@x) ergibt sportliche 10655 Zeichen. Die Variable beinhaltet also den tatsächlichen Inhalt - nur wird der abgeschnitten... eine leise Vorahnung (eigentlich ein Rückblick) kommt auf... Seit SQL Server 2005 gibt es die Aufhebung der 8000-Zeichen Grenze bei Texten vom Datentyp Zeichen: Konkret war bis SQL Server 2000 aufgrund der internen Data Page-Größen bei 4000 Zeichen für nvarchar und bei 8000 Zeichen bei varchar Schluss. Nun kann stattdessen varchar(MAX) bis 2^31-1 Bytes (also fast 2GB) verwendet werden. Damit können ab SQL 2005 auch Zeichenkettenoperationen mit längeren Texten durchgeführt werden - ohne mühsame Workarounds mit Konvertierungsfunktionen und Datentyp TEXT. Die Ursache für das Abschneiden ist also das PRINT Statement. PRINT schneidet bei 8000 Zeichen ab! Print ist ja sehr praktisch. Nur hat Microsoft anscheinend vergessen, die neuen Grenzen ab SQL Server 2005 nachzuziehen? Natürlich dachte ich zuerst an die Optionen im SQL Management Studio, wo die Limits der Ausgabe eingestellt werden kann. Aber nein, das ist es nicht. Und ich könnte natürlich Zwischenschritte einlegen oder das Problem anders lösen ... aber nur weil Print die Ausgabe abschneidet alles umstellen?? Aber es gibt eine einfache Abhilfe: In diesem Blog-Artikel von Falafel Software von Adam Anderson wird eine kleine Stored Procedure "LongPrint" in nur insgesamt 26 Zeilen erstellt, welche einen langen String auf mehrere Teile á 4000 Zeichen vom Typ nvarchar aufteilt und schrittweise ausgibt: T-SQL: Exceeding the 8000 Byte Limit of the PRINT Statement Zur Anzeige des ganzen Scripts folgen Sie einfach dem Link oder klicken Sie auf dieses Bild: Eine einfache Lösung: 1. Einmaliges Ausführen des LongPrint() Scripts in der eigenen Datenbank und danach 2. statt im eigenen Script PRINT @x zu verwenden, einfach exec LongPrint @x angeben. So klappts mit langen Strings mit mehr als 8000 (bzw. 4000) Zeichen - ohne dass die bestehende Funktionalität umgebaut werden muss! Ein netter, kleiner Workaround bis sich Microsoft hoffentlich diesem Problem annimmt und das Limit von PRINT - vielleicht mit der nächsten SQL Server Version "Denali" (2012?) - behebt.

Lync Server 2010 Best Practices Analyzer

Für alle, die sich für den neuen Microsoft Lync Server interessieren, ist der nagelneue Lync Server 2010 Best Practices Analyzer eine Empfehlung wert. Wozu dient das Tool? Die Antwort in einem Satz zusammengefasst lautet: Lync Server 2010 Best Practices Analyzer hilft Administratoren den Gesamtstatus ihrer Lync-Umgebung zu sehen. "The Microsoft Lync Server 2010, Best Practices Analyzer is designed for administrators who want to determine the overall health of their Lync Server environment." Lync Server 2010 Best Practices Analyzer ist im Microsoft Download Center herunterladbar. Das Tool sammelt Informationen der Konfiguration von Lync Server 2010 Komponenten wie Active Directory Domain Services, Exchange Server Unified Messaging und Lync Server 2010 selbst. Somit können Probleme erkannt werden und Performance Checks durchgeführt sowie die Konfiguration mit einer Best Practise verglichen werden. Ebenso werden erforderliche Updates und empfohlene Lösungen angezeigt. Für alle Lync-Admins ist Lync Server 2010 Best Practices Analyzer also ein Must Have. Für alle anderen: Microsoft Office 365 nutzen.

Microsoft Codename Atlanta - SQL Monitoring Teil Drei

Nach “Microsoft Codename Atlanta – SQL Monitoring Teil Zwei” folgt Teil Drei. Zuvor wurde Atlanta eingerichtet (Teil 1) und eine SQL Server 2008 Maschine mit Atlanta verbunden – sprich auf jeder zu überwachenden SQL Maschine ein Agent (und ein Gateway – für alle Agents) für das Cloud Service installiert. Jetzt geht es um Bedienung und Betrieb. Die Oberfläche Microsoft Atlanta ist mit der konfigurierten Live-ID via https://beta.microsoftatlanta.com/ aufrufbar und präsentiert sich nach der Anmeldung so: Die Navigationsleiste links zeigt die Übersicht, hier die Darstellung und Kurzbeschreibung der einzelnen Menüs: Alerts: Anzeige von gemeldeten Alarmen. Configuration - Current Snapshot: Anzeige der überwachten SQL Server mit ihren Eigenschaften. Configuration - Change History: Anzeige von historischen gesammelten Daten der überwachten Computer. Servers: Anzeige und Verwaltung der verbundenen Gateways und Agents. Account – Anzeige und Verwaltung des angemeldeten, verbundenen Live-Kontos. Hinweis:  Wenn der Button “Copy to Clipboard” sichtbar ist: Dieser dient dazu (da ja eine Silverlight Applikation) die aktuell markierte Zeile (mit Tabulatoren getrennt) in die Zwischenablage zu kopieren, z.B.: Change Date    Server    Path    Class    Property    Update Value    Previous Value    28.12.2010 19:35:48    Minni3.atwork.local    /    Windows Computer    IPAddress        <no value>    Soviel zur Übersicht – noch recht überschaubar. Der Betrieb Atlanta sammelt Daten von den verbunden SQL Server 2008 Maschinen. Das kann nach der Installation einige Zeit (Stunden) dauern. Keine Sorge, wenn Sie nach der Installation die installierten Agents und Gateways sehen, dann klappt die Kommunikation und man muss nur ein bisschen warten… Die Configuration ist interessant – zeigt sie doch die Einstellungen der Windows Maschine und der einzelnen Datenbanken an, so zum Beispiel das Recovery Model, den Compatibility Level und weitere Datenbank-Eigenschaften, wie hier von der Master-Datenbank: Die Configuration History lässt nachverfolgen, wann was auf der Datenbank-Maschine passiert ist, hier wurde zum Beispiel die Datenbank AtlantaTest angelegt – und alles mitprotokolliert. Es gibt keine weiteren Details (Anklicken markiert nur die Zeile, Rechtsklick bringt das bekannte Silverlight-Menü), alle Informationen sind in einzelnen Datenzeilen verfügbar. Hier erweist sich die Suche (rechts oben) als praktische Funktion um ganz bestimmte Informationen zu finden. Der Wert von Atlanta Neben der Konfiguration zeigt Microsoft Atlanta den Mehrwert in den Alerts. Hier werden Warnungen und Empfehlungen mit Details angezeigt: Zum Beispiel KB-Updates oder anstehende Datenbank-Wartungen wie fehlende Backups, Konsistenzchecks und Ähnliches. Atlanta geht nicht soweit wie beispielsweise der SQL Database Tuning Advisor oder SQL Server 2008 R2 Best Practice Analyzer, sondern bezieht sich mehr auf die Datenbanken selbst und deren reibungsglosen Betrieb. Hier einige Alerts: Eine (neue) Datebank wurde noch nie gebackupt. Für den reibungslosen Betrieb der TempDB Datenbank sollte KB960770 eingespielt werden. In der Datenbank sollte CHECKDB ausgeführt werden… Was sehr praktisch ist: Der Tab “Solution” weist auch gleich auf die Lösung hin, in diesem letzten Beispiel ein Link zu http://support.microsoft.com/kb/2033590. Es werden keine Alerts versendet – das wäre bei der durchschnittlichen, zu erwartenden Menge an Meldungen wohl auch etwas viel. Der Admin muss also Atlanta aufrufen und die Warnungen durchsehen und entscheiden, welche davon bearbeitet werden und welche nicht. Gelöste Alerts werden in Zukunft einfach nicht mehr angezeigt, also sehr simpel. Fazit Atlanta ist ein übersichtliches, einfaches Tool um mehrere SQL Server 2008 zu überwachen. Vorsorge und optimales Tuning sind immer besser als nachträgliches Suchen und Beheben von Problemen, genau das ist der Zweck von Atlanta. IT-und Datenbank-Administratoren erhalten damit ein Hilfsmittel “in the cloud” zur Wartung von Microsoft SQL Datenbank-Servern. Derzeit ist Atlanta eine Beta-Version. Es werden wohl noch einige weitere Funktionen und Verbesserungen hinzukommen. Wenn es soweit ist, werden wir wieder darüber berichten. Bis dahin: Viel Spaß beim Ausprobieren des neuen SQL Monitorings mit Atlanta Cloud Services!

Microsoft Codename Atlanta - SQL Monitoring Teil Zwei

Wie Martina bereits in ”SQL going to the cloud, äh to Atlanta“ gebloggt hat folgt hier nun Praxis Teil Zwei. Zur Erinnerung an den hübschen Codenamen: Was kann “Atlanta”? Das beschreibt am besten dieser Satz: "Microsoft Atlanta is a secure configuration monitoring cloud service that helps customers reduce downtime and improve the performance of Microsoft SQL Server deployments." Sprich: Überwachung von SQL Diensten in der Cloud. Der aktuelle Status ist Beta, bin auch schon gespannt wie der Release-Name sein wird, ob der Dienst in Office 365 oder Windows Intune einfließen wird… Hier finden Sie übrigens die Atlanta System Requirements – nichts “Besonderes” (Windows 2008, SQL Server 2008, aktueller Browser, Silverlight…), aber vor der Installation prüfen! Nachdem https://www.microsoftatlanta.com/ aufgerufen wurde und mit dem eigenen Live-Konto verknüpft wurde (Teil 1), folgt die Installation von Atlanta (CTP) auf einem zu überwachenden SQL Server 2008. Nebenbei: Es sieht so aus, dass nur EIN Live Konto hinterlegt werden kann – frei nach dem Motto: Es kann nur EINEN (Administrator) geben. Tatsächlich kann es aber MEHRERE Admins geben. Die Anleitung dazu findet sich hier: Multiple user access Zur Fortsetzung: Nach Anmeldung ist unsere hübsche Silverlight-Console offen. Jetzt müssen die Clients mit Atlanta-Diensten versehen werden: Das Klicken auf “hier” (wie auch das Hinzufügen von neuen Servern “Add Server…” in der Oberfläche) bringt diesen (bereits bekannten) Dialog. So funktioniert es also: Man benötigt mindestens EIN Gateway mit Verbindung zum Internet (zum Senden der Daten an das Cloud-Service). Es können mehrere Agents über ein Gateway senden. Clever. Nun werden die erforderlichen beiden Files heruntergeladen (und auf einen Netzwerk-Share kopiert). Danach wird auf der SQL-Server 2008 Maschine “AtlantaSetup.exe” gestartet: Es folgt ein Consolen-Setup mit Auswahl, ob Agent, Gateway oder Beide Komponenten auf der Maschine installiert werden sollen (das wird dann später in der Release wohl ein grafisches Setup sein): Also installieren wir mal “3. Both”: Tja, “3. Both” funktioniert bei mir leider nicht: “Error code is 1.” Die Ursache dafür: Auf meiner SQL Maschine klappt die Installation des Atlanta-Agents nicht … weil dieser Produktiv-SQL Server mit dem DPM Agent gesichert wird – der DPM Agent verträgt sich NICHT mit Atlanta Beta Agent! Siehe hier: Microsoft Codename Atlanta Release Notes …Because of this, Atlanta is not compatible with the Operations Manager 2007 SP1 agent, which is down-level. When you install an Atlanta agent on the same computer as an Operations Manager 2007 SP1 agent, Atlanta attempts to upgrade the existing agent to the new version. However, this attempt will fail and the Atlanta agent will not work. Ok, die Recherche war es wert, eine wichtige Information! Also testen wir das mal mit einer ANDEREN SQL Server 2008 R2 Maschine (ohne DPM Agent) nochmals und versuchen hier “3. Both”…. Schaut besser aus, das grafische Setup wird gestartet: Nach Akzeptieren der Lizenzvereinbarung wird das heruntergeladene Zertifikat angegeben und Next: …bis das Setup fertig ist (Finish), Das Fenster schließt sich, das Command Prompt zeigt den Erfolg an: Fein, refreshen wir mal die Web-Anwendung. Links in der Silverlight-Anwendung auf das Icon “Servers” zeigt das Ergebnis: Die neue SQL Maschine; insgesamt: “1 agents, 1 gateway”: Achja: Der Agent funktioniert auch mit SQL Server 2008 Express – das ist meine Testmaschine für obiges Szenario! So, was zeigt Atlanta? Schauen wir mal in die Configuration: Diese zeigt Informationen über den gewählten SQL Server: Fein, das Reporting der Installation hat mal geklappt. Jetzt müssen nur noch Daten gesammelt werden… Hier einige wichtige Links zu Atlanta: https://www.microsoftatlanta.com/ – Die Atlanta Web-Oberfläche. Microsoft Codename Atlanta – Die Website zum Produkt. SQL going to the cloud, äh to Atlanta  - Teil 1: Die Anmeldung Mehr zur Installation von Agents and Gateways. Varun Dhawan's Blog: Microsoft Codename Atlanta: How to get in there… Multiple user access – How To von Sachin Agrawal (Microsoft) Microsoft Project Atlanta Discussions – das Forum. Mehr zum Betrieb dann in Teil Drei!

Hidden features in IE9 #tee10

IE9 ist cool. Nicht nur wegen Geschwindigkeit und HTML5-Unterstützung sondern auch wegen einer Reihe von neuen, coolen Funktionen - für Anwender und vor allem für Web-Developer. Einige davon hat Giorgio Sardo, Sr. Technical Evangelist bei Microsoft, auf der TechEd 2010 verraten. Also: Nicht weitersagen! Einige Funktionen sind ganz neu - Holen Sie sich die letzte IE9 Platform Preview von www.ietestdrive.com! Neu in IE9 sind die "New Tabs" (STRG+T). Wie kann man einstellen, wie viele zuvor besuchten Websites IE9 präsentiert, wenn man eine neue Website mit "New Tab" öffnet? Standardmäßig werden zwei Zeilen mit den am stärksten besuchten Seiten angezeigt. Ich finde diese Funktion sehr praktisch, denn beim Öffnen einer neuen Registerkarte will man im Regelfall ja ... eine neue oder bestehende Seite öffnen. Das Anpassen funktioniert recht einfach: Starten Sie den RegistrierungsEditor regedit.exe und erstellen Sie in HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TabbedBrowsing\NewTabPage einen neuen Key vom Type DWORD mit Namen "NumRows" und dem Wert "4" (Hex oder Dez.) - wie hier: Danach IE9 schließen, neu starten und ausprobieren: Voila, 4 Zeilen mit den meist besuchten Websites. Fesch, oder? (Fast) ganz neu: Die Developer Tools (F12). Im Menü "Extras/Zeichenfolge des Benutzer-Agents ändern" (Change user agent string) kann das Rendering auf andere Browser umgeschalten werden, z.B. auf einen "Benutzerdefinierten" Typ mit Einstellungen fürsMobile Phones od. ähnliche Browserkennungen - Cool für Web Developer! Testen wir mal mit bing.com: Heute wieder mal mit besonders hübschem (Urlaubs) Foto. (Woher weiß bing, dass ich auf Urlaub fahren möchte...?) Stellen wir mal den User Agent auf Benutzerdefiniert: Und tragen diese Zeichenfolge ein: Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3 Und sehen uns bing.com erneut an (Refresh mit F5): Hat funktioniert: So sieht bing.com also am iPhone aus. ;-) Sehr hilfreich finde ich auch die Bild-Informationen. In Developer Tools, Menü "Bilder/Bildabmessungen ... anzeigen" aktivieren - zeigt die Größe aller Bilder in der Webseite, auch die Alt-Tag-Info, Bildpfad und Bildgröße: So wird dann die  Bild-Information in jedem Bild eingeblendet: Gerade für unvollständige Bildinformationen ist das für Developer sehr hilfreich, ebenso auch der Bildbericht (der hat bei mir aber nicht funktioniert, ich nehme an, daran wird noch gearbeitet...). Im Developer Menu File kann auch ein alternativer Texteditor, wie z.B. Visual Studio, eingestellt werden um den Seitenquelltext darzustellen: Jetzt zu einem sehr coolen Feature: Javascript. Die nun beschriebene Funktion ist jedoch erst im letzten IE9 Preview 7 enthalten (die vorigen Funktionen sind bereits in IE9 Beta integriert): Man nehme eine Website wie z.B. Facebook . Ich will mir den Seitenquellcode ansehen - also F12. Hier nun auf Skript: Alle in der aktuellen Seite eingebetteten Javascripts werden in einer eigenen Dropdown angezeigt. Hm. Der Javascript-Code ist für optimale Ladezeiten optimiert. Gut fürs Web - aber für einen Entwickler kaum lesbar. Dafür gibt es in den Tools die Funktion "Format Javascript": Besser: ;-) Aus optimiertem JS-Code wird gut lesbarer Code. Oder - wie man heutzutage Zustimmung zeigt: "Gefällt mir". Fazit: In IE9 gibt es - gerade für Web Developer - viel zu entdecken. Starten Sie Ihre eigene Entdeckungstour! Viel Spaß!

XING Social Connector für Outlook erschienen

Verwenden Sie XING? Wenn ja, dann sehen Sie sich den nagelneuen XING Social Connector für Outlook an und nutzen Sie alle Vorteile des XING Business-Netzwerks direkt in Microsoft Outlook. So berichtet auch das "Das Microsoft Deutschland Blog zu Office 2010" über das PlugIn: XING Social Connector für Outlook erschienen Das PlugIn funktioniert mit Outlook 2003, 2007 und 2010 (x86). Der XING Connector ist hier downloadbar: outlook.xing.com Zuerst muss bei Verwendung von Outlook 2003 und 2007 der Outlook Social Connector (OCS; Link ebenfalls auf der XING Download-Seite oder hier) installiert werden, danach der XING Connector. Outlook 2010 installiert OCS automatisch. Viel Spaß beim Netzwerken!

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!

Batch Script to Auto Update Sysinternals Tools

Da hat sich doch SysAdminGeek ein kleines Script geschrieben, um die Sysinternals Website nach neuen Updates der Sysinternal Tools abzufragen... Das kleine Script liest live.sysinternals.com/tools aus und vergleicht die online Files mit jenen im lokalen Filesystem im aktuellen Verzeichnis. Ich selbst hätte es zwar eher als kleine .net Console-Applikation gebastelt, aber der Zweck heiligt ja bekanntlich die Mittel; bzw. ein begabter SysAdmin bekommt das wahrscheinlich auch in PowerShell hin - aber so als Commandline-Batch ist es definitiv rasch und einfach! SysAdminGeek: Batch Script to Auto Update Sysinternals Tools "...All you have to do is put the batch script file into the folder where your Sysinternals tools are located and the script does the rest, no configuration is needed." Genau das Richtige für SysAdmins. ;-)

Streaming Video mit IIS7 - Teil 1 Video Encoding

“Gehns, stellens mir doch schnell das Video rauf!” oder so ähnlich bekommt ein IT-Admin oder IT-Dienstleister oftmals einen kleinen Auftrag von der Geschäftsleitung oder vom Kunden. Damit ist gemeint: Ich hab da ein Video bekommen, bitte kümmern Sie sich darum, dass es online angesehen werden kann und dass es funktioniert. Hm, ein Video, ok… Könnte ein großes File mit vielen MB sein… Welches Format? Und mit welchem Player? Oder einfach per FTP oder HTTP zum Download stellen? Und was wenn der Download dann die anderen Webs auf dem Webserver verlangsamt oder blockiert? Muss dazu was programmiert werden? Halt – die Lösung ist nahe: Wenn man Windows Server 2008 und IIS7 als Webserver hat, braucht man nur noch Microsoft Expression Encoder auf dem Client installiert und ein paar kleine Schritte zur Lösung! (Ich weiß, es gibt bereits Microsoft Expression Encoder 4 – aber diese Version ist noch nicht so weit verbreitet und auch auf meinem PC noch nicht installiert, daher wird es Version 3 auch tun ;-). Mit Microsoft Expression Encoder kann mit ein paar Klicks ein Streaming Video mit Silverlight Player erstellt werden. Streaming Video bedeutet, dass der Webserver immer nur Teile des Videos an einen Videoplayer in einer Webseite ausliefert. Damit wird Bandbreite gespart und die “User Experience” durch automatische Erkennung der Bandbreiten-Geschwindigkeit verbessert. Es wird nur ausgeliefert, was und wie es vom Benutzer gebraucht wird – z.B. beim Klicken auf die Mitte des Videos wird der erste Teil nicht geladen. D.h. bei schneller Internet-Leitung erhält der Benutzer die bestmögliche Video-Qualität, sonst eine heruntergestufte Video-Qualität. Durch das Kodieren des Videos können die möglichen Bitrates selbst vorgegeben werden, dazu unten mehr. In diesem kurzen step-by-step Artikel geht es nicht um die vielen Möglichkeiten von Expression Encoder zur Videobearbeitung, sondern nur darum, rasch aus einem Video-File ein Internet-taugliches “Streaming Video” zu erstellen. Als Beispiel wird ein mit einer Flip-Cam aufgenommenes etwa eineinhalb minütiges Kurzvideo von Mary Joe Foley´s Session der #WPC10 verwendet. Also los gehts: Schritt 1: Microsoft Expression Encoder 3 starten und in File / Import… und das Video-File auswählen: Schritt 2: In Register “Encode” das Output-Format “IIS Smooth Streaming” auswählen – hier rot markiert: Schritt 3 - Optional: Sie können auch selbst die gewünschten Kodierungen für verschiedene Bitrates vorgeben. Erweitern Sie die Eigenschaft “Encoding for Silverlight”, “IIS Smooth Streaming” und wählen Sie bei den gewünschten Formaten im Kontextmenü “Apply to selected items” aus. Damit springt dieses Format nach unten in den “Video”-Bereich – oder Sie definieren selbst mit “+” ein eigenes Format. Nicht gewünschte Formate können mit dem Papierkorb-Symbol entfernt werden (alle wesentlichen Elemente sind rot markiert):   Hier im Beispiel werden nur drei Video-Formate codiert (1,4MB, 688KB und 230KB). Grundsätzlich genügen drei Formate (low – medium – high), jedoch lautet die Empfehlung, eher viele Versionen anzubieten: “…BUT it´ll make for more bitrate options for the player to choose and a MUCH better, smoother experience.” Die user experience ist also weit höher, wenn eine möglichst passende Version für die aktuelle Bandbreite ge-streamed wird – das bedeutet natürlich mehr Versionen und höherer Aufwand beim Kodieren – zu mindestens ist der Aufwand einmalig und Expression Encoder macht das automatisch. Schritt 4: Nun muss nur noch im Register “Output” das Player-Template “Smooth Streaming Graphing Player” ausgewählt werden (siehe wieder rote Markierung) – und in den Feldern darunter der Ausgabe-Dateiname und das Verzeichnis – nachdem mehrere Dateien erstellt werden, sollte es ein neues oder leeres Verzeichnis sein:   Schritt 5: Klick auf “Encode” am unteren Fensterrand. Here we go! Das Encoding ins streaming WMV-Format für die verschiedensten Übertragungs-Geschwindigkeiten startet: Wenn das Kodieren fertig ist, öffnet sich automatisch der Browser und das Video kann getestet werden: Das wars. Im Output-Verzeichnis wurden diese Files angelegt: Hier sind von Expression Encoder alle erforderlichen Files für das Streaming in unterschiedlichen Bitrates erstellt worden. Anwender können den folgenden Teil File-Infos getrost überspringen. ;-) [File-Infos] Die *.ism* Dateien sind XML-Dateien. Hier eine kurze Erklärung dazu – wer tiefer gehen möchte, dem empfehle ich Scott Hanselman´s Artikel Installing and Setting Up and Encoding for IIS 7 Smooth Streaming and Silverlight. In der <videofile>.ism Datei sieht man sehr schön die Einstellungen für die verschiedenen Transfer-Rates – nur für den Streaming Server erforderlich: “Describes the relationships between media tracks, bitrates and files on disk. Only used by the IIS Smooth Streaming server – not by client” In der <videofile>.ismc Datei stehen die verwendeten Codecs und beispielsweise die maximale Auflösungen des Players – dieses File wird zuerst zum Client geliefert: “Describes to the client the available streams, codecs used, bitrates encoded, video resolutions, markers, captions, etc. It’s the first file delivered to the client” Hint: Das “Smooth Streaming File Format” basiert auf dem ISO-standardisierten Base Media File Format (das ist das MP4 File Format, dieses folgt der ISO/IEC 14496-12 Spezifikation). Bei Bedarf kann noch die default.html Datei angepasst werden, der wesentliche Teil ist die Einbindung des Silverlight Players MediaPlayerTemplate.xap und SmoothStreaming.xap, die ebenfalls im erzeugten Verzeichnis liegen. [End of File-Infos] Das wars. Nun einfach das ganze erstellte Verzeichnis auf den IIS7 Webserver per FTP o.ä. uploaden. In Teil Zwei gehts um die Konfiguration des IIS7 – das funktioniert noch einfacher. ;-)

TFS2010 mit Visual Studio 2008

Diesmal ein kleiner Tipp für Visual Studio-Developer und Developing-Teams. Wer - so wie ich - den neuen TFS 2010 (Visual Studio Team Foundation Server 2010) in seinem Entwicklungsteam einsetzt kann von vielen neuen Funktionen in der Team-Zusammenarbeit profitieren. Also liegt der Gedanke nahe, TFS2010 auch mit Visual Studio 2008 zu verwenden. Unbedarfter Weise öffnet man ein "altes" Projekt mit Visual Studio 2008 und versucht nun die Verbindung zum neuen TFS2010 herzustellen, um das bestehende 2008er-Projekt in TFS2010 einzuchecken... und scheitert. In meinem Fall heißt mein alter TFS 2008 "TFS2" und der neue TFS 2010 "TFS" (beide mit Standard-Port 8080). So sieht mein Verbindungsversuch aus, gefolgt von der Eingabe der Credentials: ...jedoch leider ohne Erfolg: Hm. In meinem VS2010 hat das problemlos geklappt... Also mal rasch die Einstellungen in der neuen TFS 2010 Administration Console einsteigen und URLs prüfen: Passt soweit, alles Default, Rechte sind auch gesetzt. Der Pfad zu dem ich mich via meinem VPN verbinden möchte ist eine Team Project Collection "atwork" mit dieser URL: http://tfs:8080/tfs/atwork In Visual Studio 2010 sieht die Connect-Box auch anders aus, hier kann der Path extra angegeben werden und die Verbindung klappt: Nur: wie sag ich's meinem Visual Studio 2008? Hint: Die Idee, den Path "8080/tfs/atwork" einfach in das "Port"-Feld hinten anzufügen um die richtige URL zusammenzustellen klappt auch nicht, es folgt dieselbe Fehlermeldung - auch mit der korrekt zusammengesetzten URL. So gehts also auch nicht. What next? Zum Glück gibt es Suchmaschinen und netterweise hat Thomas Müller in seinem Blog auch eine Lösung gefunden! Damit dieser TFS-Connection-Pfad im Team Explorer von Visual Studio 2008 akzeptiert wird, müssen zwei Voraussetzungen erfüllt sein: Visual Studio 2008 SP1 und SP1 Patch KB974558 VS 2008 SP1 sollte natürlich schon längst installiert sein... also den Patch installieren und erneut mit der ganzen URL http://TFS:8080/tfs/atwork ausprobieren: Und siehe da - die Verbindung mit der gewünschten URL von Visual Studio 2008 zum TFS2010 funktioniert! Der Rest funktioniert wie gewohnt... plus die neuen TFS2010-Funktionen. Hoffe, dieser Step-by-Step Tipp erspart vielen Developern graue Haare. ;-)

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!

Apple iPhone iOS 4.0 synct nicht mit Exchange

Ich habe seit dem iOS 4.0 Update auf meinem Apple iPhone die Probleme, dass der Kalender nicht mehr vernünftig funktioniert, siehe Ist ein neues (i)OS immer besser?  Heute habe ich einen KB-Artikel TS3398 vom 28. Juni bei Apple gefunden, der sich anscheinend genau mit diesem (meinem) Problem befasst: iOS 4: Exchange Mail, Contacts, or Calendars may not sync after update So wird das Symptom beschrieben: "Immediately after updating to iOS 4, some users may notice that Exchange ActiveSync Mail, Contacts, or Calendars do not sync, or sync very slowly..." Wenn Sie also - so wie ich - mit einem Exchange Server ("on premise" oder "in the cloud") synchronisieren: Mails, Kontakte und Kalender werden nicht oder nur sehr sehr langsam synchronisiert. Der Grund dürfte daran liegen, dass im Standard-Profil zu wenig Timeout für die Synchronisation mit Exchange eingestellt ist, das heißt, die Synchronisation bricht zu rasch ab. Dieses Verhalten betrifft alle iPhone und iPod Touch Produkte, die mit iOS 4.0 upgedated werden können: iPod touch, iPhone 3G, iPhone 3GS und iPhone 4. Und die Lösung - sprich der Workaround für dieses Problem - sieht so aus: Apple KB TS3398. Hier die Schritt-für-Schritt Anleitung für alle betroffenen iPhone User: Zunächst am iPhone mit Safari auf den Artikel http://support.apple.com/kb/TS3398 surfen und den Link download the configuration profile anklicken.   Tipp: Falls der Link das Profil am iPhone nicht wie in Schritt 2 öffnet: Das Profil am Computer downloaden und sich selbst per E-Mail senden, E-Mails synchronisieren und dann das Attachement am iPhone anklicken (beim 3G hat es direkt von der Website funktioniert, beim 3GS nicht...).   Alternativ: Downgeloadetes Profil selbst emailen: Es folgt "Profil installieren" mit dem Titel "EAS Default Task...". In der Beschreibung steht: "Sets the default timeout for talking to Exchange servers...". "Installieren" auswählen.      Es folgt die Warnung "Unsigniertes Profil". (Herausgeber: Apple Inc, Unsigniert. Autsch...)  Also auf "Installieren" klicken. Gegebenenfalls iPhone-Code eingeben:  Nach der Installation rechts oben auf "Fertig" klicken.  Nun das iPhone aus- und danach wieder einschalten, also ein "Reboot".  Nach der Installation wird in den "Einstellungen > Allgemeines > Profile" das neue Profil angezeigt. Das sollte dann so aussehen, dass zwei Profile vorhanden sind, jenes des Providers und das "EAS Default Task Timeout" Profil.    Ausprobieren: Mit Exchange synchronisieren. Prüfen. In meinem Fall z.B. mit dem neu synchronisierten Kalender.  Das wars. Ich habe diese Schritte mit meinem iPhone 3G ausprobiert und - hurra - es scheint nun wieder gut zu funktionieren! Was so ein kleines neues Profil ausmacht... Ich hoffe, die kleine Anleitung hilft allen iPhone-Usern, die dieses Problem ebenso haben! Anleitung ohne Gewähr, "but it worked on my machine!" ;-)