Stabilere SSIS Entwicklung durch die neue T-SQL Funktion WITH RESULT SETS

26. März 2012

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.