SQL Server 2005 TechTalk September 2005 Sebastian Weber Developer Evangelist Microsoft Deutschland GmbH [email protected] http://blogs.msdn.com/sebweber Eine persönliche Fallstudie … „Großhandel“ für digitale Medien > 15 Mio. Medien Verlage haben verschiedene Formate > 30 Formate Integration der Dienste in Kunden-Intranets XML Web Services Grobarchitektur des Systems Kunden Verlage XML Daten Importer SQL Server Bestellungen Web Service Zugang Berichte & Auswertungen Eigenes Management Warum erfinden wir das Rad ständig neu? SQL Server 2005 Plattform Agenda Die Services im Überblick Erweiterungen der Datenbank T-SQL Erweiterungen .NET Framework Integration XML & Web Service Unterstützung Volltextrecherche Integration Services ETL-Platform “Best in Class”Usability Workflow Designer Erweiterbar Analysis Services Business Intelligence Unified Dimensional Model Real-time Web Services Reporting Services Berichte erstellen, verwalten und verteilen Office Integration Verschiedene Datenquellen Verschiedene Ausgabeformate Reporting Services • Report Builder • Visual Studio Integration Demo: Report Builder Demo: Visual Studio Integration Notification Services Plattform für Benachrichtigungsanw. Deklaratives Programmiermodell Effizienter und skalierende Ausführungsdienst Entwickler schreibt Benachrichtigungsanw. Replication Services Standort-übergreifende Datenverteilung B A Peer-to-Peer Verteilung Verteilung von Volltextindizes Web-Synchronisation Monitoring C Service Broker Plattform für asynchrone Kommunikation B A Datenbankanwendungen T-SQL Integration Transaktionen Zuverlässige Übermittlung Transport C Transport D Transport SQL Server 2005 Plattform Agenda Die Services im Überblick Erweiterungen der Datenbank T-SQL Erweiterungen .NET Framework Integration XML & Web Service Unterstützung Volltextrecherche Viele neue Helfer … Neue Datentypen DDL Trigger DML mit Ausgabe TOP DRI Erweiterungen Fehlerbehandlung CTE Except und Intersect Ranking Funktionalität Index Verbesserungen Snapshot Isolation Level Recompile Optimierung XML Showplan Mehr Speichern mit MAX varchar(max) und nvarchar(max) Nachfolger von „text“ bzw. „ntext“ varbinary(max) Nachfolger von „image“ bis 2 GB (2^31 - 1 Bytes) .WRITE & SUBSTRING Versuchen & Fangen Fehlerbehandlung á la C# & Co. Verschachtelungen möglich Kein „Rausfliegen“ aus Batches mehr! BEGIN TRY sql statements … END TRY BEGIN CATCH sql statements … END CATCH Common Table Expressions Common Table Expression (CTE) Sind so was wie „ad-hoc views“ Sind in SQL-99 definiert Sind weniger kompliziert als man denkt CTEs sind Eintrittskarte zur Rekursion Iterativer Ansatz meist deutlich aufwändiger So sieht eine CTE aus! WITH <CTE-Name> (<Spaltennamen>) AS ( <Abfrage> ) SELECT * FROM <CTE-Name> WITH ProdukteCTE (Name, Kategorie) AS ( SELECT PName, KName FROM Produkte P INNER JOIN Kategorien K ON P.KategorieID = K.ID ) SELECT * FROM ProdukteCTE … Der Traum von der Rekursion WITH <CTE-Name> (<Spaltennamen>) AS ( <SELECT … FROM …> UNION ALL <SELECT … FROM CTE-Name> ) SELECT * FROM <CTE-Name> Rekursion endet, wenn 2. Select kein Ergebnis mehr liefert! T-SQL Rekursive CTE EXCEPT / INTERSECT TOP Row_Number() OVER (…) OUTPUT Demo: Rekursive CTE Abfrage DECLARE @StartOrt char(50); SET @StartOrt = ‘Frankfurt'; WITH cte (ID, Ort, Macht) AS ( SELECT ID, Ort, Macht FROM DieWelt WHERE Ort = @StartOrt UNION ALL SELECT dw.ID, dw.Ort, dw.Macht FROM DieWelt dw JOIN cte ON dw.ID = cte.Macht ) SELECT * FROM cte ORDER BY ID Demo: EXCEPT & INTERSECT -- “Zeige Daten von A, die nicht in B stehen” SELECT * FROM A; EXCEPT SELECT * FROM B; -- “Zeige Daten, die in A und B stehen” SELECT * FROM A; INTERSECT SELECT * FROM B; Demo: TOP -- TOP unterstützt Ausdrücke: DECLARE @n INT; SET @n = 3; SELECT TOP (@n) FROM A; -- TOP UPDATE DELETE INSERT auch in TOP (5) TOP (5) TOP (5) DML: A SET x=1, y=2; ... ... SELECT * ... Demo: Paging dank CTE WITH Namen AS ( SELECT Row_Number() OVER (ORDER BY Nachname) AS Nummer, Nachname, Vorname FROM NamenNeu ) SELECT * FROM Namen WHERE Nummer BETWEEN 5 AND 9 Demo: OUTPUT -- Zugriff auf alte und neue Werte: UPDATE Tabelle SET A=1 OUTPUT INSERTED.*, DELETED.* -- Zugriff auf eingefügten Datensatz (berechnete -- Spalten, AutoIncs …): INSERT Tabelle (Wert) VALUES (42) OUTPUT INSERTED.* -- Zugriff auf gelöschten Datensatz DELETE FROM Tabelle OUTPUT DELETED.* Zusammengefasst: T-SQL varchar(max), nvarchar(max), varbinary(max) TRY / CATCH CTE EXCEPT/INTERSECT TOP SELECT Row_Number() OVER … OUTPUT Agenda Die Services im Überblick Erweiterungen der Datenbank T-SQL Erweiterungen .NET Framework Integration XML & Web Service Unterstützung Volltextrecherche Was bietet die Integration? Serverseitige Routinen in C#, VB.NET, … Stored Procedures, Functions, Triggers, Data Types & Aggregates Erweitertes Sicherheitsmodell Einheitliche Entwicklungsumgebung Performancevorteile Integration != Integration Hier: SQL 2000 Extended Stored Procedures SqlServr.exe 1. Connection Ext. SP Select * Client 2. Connection Daten 2. Thread Abbildung aus A First Look at SQL Server 2005 for Developers, AW Select * SQL Server 2005 Beste Integration der Welt! SqlServr.exe 1. Connection Client SqlCommand cmd = ... cmd.ExecuteNonQuery() PInvoke Managed Code Daten Unmanaged Code Abbildung aus A First Look at SQL Server 2005 for Developers, AW Implementierung Servercode Implementierung • Stored Procedures, Functions & Triggers Statische Methoden mit „[Attribut]“ • Aggregates Implementierung als Struct mit Attribut [SqlUserDefinedAggregate] • Types Implementierung als Klasse oder Struct mit Attribut [SqlUserDefinedType] So geht‘s! Assembly VB,C#,C++ SQL Abfragen: SELECT GetOrderCount(region) FROM order VS .NET Projekt SQL Server Build SQL Definitionen: create assembly … create function … create procedure … create trigger … create type … So geht’s im Detail! • Stored Procedure in C# • User Defined Type in C# Demo: Stored Procedure [SqlProcedure] public static void ZeigeDaten (string tabelle, string spalte) { // Context Connection öffnen SqlConnection conn = new SqlConnection(); conn.ConnectionString = “context connection = true”; conn.Open(); // Command “zusammen hacken” SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = “SELECT “ + splate + “ FROM “ + tabelle; // Ergebnis des Readers an Client “senden” SqlContext.Pipe.Send(cmd.ExecuteReader()); } Demo: User Defined Type [SqlUserDefinedType(Format.Native)] public struct MeinRechteck : INullable { public SqlDouble Laenge; public SqlDouble Breite; // “String-Handhabung” public override string ToString() { /*…*/} public static MeinRechteck Parse(SqlString s) {/*…*/} // “Null-Handhabung” public bool IsNull { get {/*…*/} } public static MeinRechteck Null { get {/*…*/} } } .NET oder T-SQL? Verwenden Sie .NET Routinen … … wenn es mit T-SQL nicht möglich ist … für aufwendige Rechenoperationen … um Logik zu implementieren … wenn auf wenige Daten zugegriffen wird Verwenden Sie T-SQL … … bei daten-intensiven Abfragen Fallweise Unterscheidung notwendig!! Agenda Die Services im Überblick Erweiterungen der Datenbank T-SQL Erweiterungen .NET Framework Integration XML & Web Service Unterstützung Volltextrecherche <Damals/> &amp; <Heute/> XML mit dem Sql Server 2000 (SqlXml) Relationale Daten XML (FOR XML) XML Relationale Strukturen (OPEN XML) XML-Dokumente als „Text“ speichern SQL Server 2005 bietet aber mehr XML-Datentyp mit XSD-Unterstützung XQuery/XPath im Sql-Statement nutzbar Indexierung der XML-Knoten Verbesserung FOR XML und OPEN XML XML-Datentyp verwenden CREATE TABLE XmlTabelle { ID int, MeinXml XML ('MeinSchema.xsd') } CREATE INDEX idx_MeinXml ON XmlTabelle (MeinXml); Indexierung nur möglich, wenn dem Xml ein Schema zugewiesen wurde („typisiert“) Volltext-Indexierung wird ebenfalls unterstützt! Natürlich auch per Management Studio … Die große Liebe: SQL + XML SELECT ID, MeinXml.value('/Mein/XQuery‘, ‘string‘) AS Wert FROM XmlTabelle SELECT ID, MeinXml.value('/Mein/XQuery‘, ‘string‘) FROM XmlTabelle AS Wert XML Zugriffsmöglichkeiten XML Methoden query(), value(), exist(), modify(), nodes() Komplexe XML-Operationen mit FLWOR FLWOR spricht man „Flower“ Und bedeutet For-Let-Where-Order-Return Eigentlich nur FOWR, da „L“et noch nicht supported XML im SQL Server • FLOWR-Ausdruck Demo: FLWOR-Ausdruck declare @x xml set @x=' <Bestellungen> <Bestellung <Bestellung <Bestellung <Bestellung </Bestellungen>' Name="Anne" Summe="110"/> Name="Manfred" Summe="50"/> Name="Peter" Summe="250"/> Name="Marlene" Summe="75"/> SELECT @x.query(' for $Bestellung in //Bestellung[xs:double(@Summe) > 100] return string($Bestellung/@Name) ') Zugang zum SQL Server 2000 SQLXML IIS ODBC, OLE DB, Ado.Net TDS/ TCP Named Pipes SQL SERVER Zahlreiche Zugriffsoptionen vorhanden Aber 1: trotzdem nicht für jeden erreichbar Aber 2: weit weg vom Server Zugang zum SQL Server 2005 SQLXML IIS ODBC, OLE DB, Ado.Net TDS/ TCP Named Pipes SOAP/ HTTP (Unix) Client SQL SERVER SQL Server Web Services Interessant hinsichtlich Interoperabilität Getestet mit: Jbuilder 9, Axis 1.1, Perl, … SOAP/HTTP Läuft ohne IIS ~%40 schneller als SQLXML SQLXML bleibt bestehen Updategrams, Bulkload, Query strings in URL Zusammengefasst XML Eigener Datentyp mit XQuery Support Indexierung der Knoten möglich FOR XML / OPEN XML verbessert Web Services Flinker SOAP-Layer, ~40% schneller als SQLXML Kompatibilität zu anderen System getestet Gut für SOA-Träume? Agenda Die Services im Überblick Erweiterungen der Datenbank T-SQL Erweiterungen .NET Framework Integration XML & Web Service Unterstützung Volltextrecherche Was ist Volltextrecherche? Quelle: http://wikipedia.de Schneller & Besser als LIKE Suchen wie eine Suchmaschine Ranking, Stemmers, Stop Words … Suche innerhalb der Dokumente Word, Excel, PowerPoint, … Erweiterbar durch IFilter beispielsweise für PDF Abfrage per T-SQL Befehle Volltextindex ist etwas anders Nicht ein „normaler“ Index Aktivierung pro Datenbank notwendig Braucht Pflege Nicht zwingend aktuell Sprachabhängig Replikation mit SQL Server 2005 möglich Suchen wie die Profis … • CONTAINS • FREETEXT Demo: CONTAINS -- Sucht gezielt nach dem Ausdruck SELECT Volltext FROM VolltextTabelle WHERE CONTAINS(Volltext, ‘Auto AND CD AND NOT Monitor‘) -- Zeigt zusätzlich noch den Ranking-Wert an SELECT Volltext, CT.Rank FROM VolltextTabelle JOIN CONTAINSTABLE(VolltextTabelle, Volltext, ‘Auto AND CD AND NOT Monitor‘); Demo: FREETEXT -- Sucht nach den besten Treffern für den Ausdruck SELECT Volltext FROM VolltextTabelle WHERE FREETEXT(Volltext, ‘Ein Auto mit CD-Player‘) -- Zeigt zusätzlich noch den Ranking-Wert an SELECT Volltext, CT.Rank FROM VolltextTabelle JOIN FREETEXTTABLE(VolltextTabelle, Volltext, ‘Ein Auto mit CD-Player‘); Anwendungsbeispiele Suche in Artikelstamm nach Beschreibung Dokumentenmanagement auf eigene Faust Suchmaschinen, Buch-Shops, Auktionsplattformen, Musik-Downloads Sie alle nutzen Volltextrecherche! Agenda Die Services im Überblick Erweiterungen der Datenbank T-SQL Erweiterungen .NET Framework Integration XML & Web Service Unterstützung Volltextrecherche Warum das Rad neu erfinden? CLR ! SQL Web Services ! Integration Services ! XML Daten Importer Bestellungen SQL Server XML ! Volltextrecherche ! Web Service Zugang Berichte & Auswertungen SQL Reporting Services ! Fragen und Antworten Vielen Dank! Sebastian Weber [email protected] http://blogs.msdn.com/sebweber © 2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.