Aufbauend auf der Serie „Neue Funktionen im SQL Server 2012“ meines Kollegen Markus Schwamberger möchte ich in diesem Artikel auf eine weitere neue Funktion des SQL Servers 2012 hinweisen, die speziell für SSIS Entwickler sehr interessant sein könnte.
Jeder SSIS Entwickler kennt bestimmt die Problematik, dass man in seinen SSIS Paketen Abfragen oder Views auf eine Datenbanktabelle erstellt hat und aus irgendeinem Grund müssen in den zugrunde liegenden Tabellen Spaltennamen bzw. Datentypen geändert werden. Dies hat zur Folge, dass die SSIS Pakte nicht mehr lauffähig sind und angepasst werden müssen. Hier kommt die neue SQL Server 2012 Funktion WITH RESULT SETS ins Spiel, die dieses Problem elegant löst.
Lassen sie uns jetzt zu einem Beispiel gehen, das die neue Funktion näher beleuchtet. Nach dem Ausführen des Skriptes erhalten Sie eine Tabelle mit mehreren Spalten und eine Stored-Procedure, die eine einfache Select-Abfrage auf die zuvor angelegte Tabelle ausführt.
USE tempdb GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Person]') AND type in (N'U')) DROP TABLE [dbo].[Person] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Person]( [ID] [int] NOT NULL, [PersonType] [nchar](15) NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [LastName] [nvarchar](50) NOT NULL, [Activ] [bit] NOT NULL, [EntryDate] [datetime] NOT NULL, CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO [dbo].[Person] VALUES (1,'Employee','Thorsten', 'Fleckenstein', 1, '20120201') GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DemonstrateWithResultSetsFeatureOfDenali]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[DemonstrateWithResultSetsFeatureOfDenali] GO CREATE PROCEDURE DemonstrateWithResultSetsFeatureOfDenali AS BEGIN SELECT ID, FirstName + ' ' + LastName AS FullName, PersonType, Activ, EntryDate FROM dbo.Person END GO GO
Führt man nun die Stored-Procedure in der gewohnten Art und Weise aus:
USE tempdb GO EXEC DemonstrateWithResultSetsFeatureOfDenali GO
erhält man exakt die Spaltennamen und Datentypen, die vorher in der Tabelle definiert sind als Rückgabewerte der Select – Abfrage.
Ändert sich dabei der Datentyp in der Tabelle verändert sich dementsprechend auch der Datentyp der Stored-Procedure-Ausgabe, was wiederum zur Folge hätte, dass ein SSIS Paket welches diese Stored – Procedure als Datenquelle verwendet, nicht mehr funktionsfähig wäre. Führt man nun die gleiche Stored-Procedure mit dem neuen WITH RESULT SETS Feature von SQL Server 2012 aus, vermeidet man das oben beschriebene Problem.
EXEC DemonstrateWithResultSetsFeatureOfDenali WITH RESULT SETS ( ( ID INT, ContactPersonName VARCHAR(150), PersonType VARCHAR(15), Activ SMALLINT, EntryDate DATE ) )
Wie man im obigen Beispiel sehen kann, wird mit Hilfe der neuen WITH RESULT SETS Funktion exakt definiert, wie die Stored-Procedure die Daten zurückgeben soll. Im Beispiel wird der Name von FullName auf ContactPerson, sowie die Datentypen der Felder Activ und EntryDate geändert.
Vergleicht man die Ausgabe des ersten Beispiels mit der Ausgabe, die mit Hilfe der WITH RESULT SETS Funktion erzeugt wird, kann man erkennen wie sich der Feldname und die Datentypen verändert haben. Ändert man nun Felder auf Tabellenebene, gibt die Stored – Procedure nach wie vor, die in der WITH RESULT SETS Funktion definierten Werte zurück und ein SSIS Paket, welches diese Funktion als Datenquelle benutzt, würde keine Fehler verursachen.
Wie man sieht kann man mit Hilfe der neuen SQL Server 2012 WITH RESULT SETS Funktion eine erhebliche Verbesserung in der Wartung und Fehlersicherheit von SSIS – Paketen erzielen.Sicherlich bietet diese neuen Funktion auch viele weitere Einsatzmöglichkeiten in Entwicklungsprojekten.