Datenbanken und mehr

24. September 2007

Dynamisches T-SQL

Filed under: T-SQL — Urs Gehrig @ 08:37

Nenn es wie du willst; dynamisches T-SQL, Codegenerierung oder einfach ein cleveres Script. Fact ist, dass du bei der Erstellung deiner T-SQL Scripts nicht immer schon den ganzen Code kennst, den du zur Laufzeit ausführen musst. Mit dem richtigen Gewusst-Wie hast du aber bereits gewonnen. Beispiel gefällig?

Für ein partnerspezifisches Zusatzmodul zu einem Standard ERP System musste ich ein SQL Setup-Script erstellen. Dieses Script hat die Aufgabe langwierige Konfigurationseinstellungen, welche der ERP Administrator in der Regel per Hand via GUI vornimmt, automatisch einzuspielen. Das Script muss für ein und dieselbe DB beliebig oft ausgeführt werden können. Daher hat das Script zu Begin eine Clean-Up Section, wo allenfalls bereits existierende Konfigurationen aus der DB gelöscht werden. Eine Teilaufgabe in dieser Clean-Up Section besteht aus dem Löschen einzelner Felder aus einer Tabelle. Und genau hier benötige ich mein dynamisches T-SQL Script: Die Namen der zu löschenden Felder sind nicht konstant, sondern müssen aus einzelnen Werten in einer weiteren Tabelle hergeleitet werden (Vielleicht etwas ungewöhnlich. Da es sich hier aber um ein Standard ERP System handelt, welches dieses Verhalten vorgibt, habe ich darauf keinen Einfluss und muss wohl oder übel einfach damit leben). Wer mich schon etwas länger kennt, weiss dass ich nichts von Cursor basierenden Lösungen halte; bei mir haben nur Set basierende Scripts eine Chance. So auch hier. Zuerst die Lösung, dann die Kommentierung:

— drop columns form table tdAttributes
DECLARE @stmt nvarchar(1000)

SET @stmt = (SELECT N‚ALTER TABLE dbo.tdAttributeValues DROP COLUMN Attr_‘ + AttributeName + N‚; ‚ as [text()]
             FROM dbo.tdAttributes
            
WHERE AttributeGroup = ‚bbvPersECA‘
             FOR XML Path());

EXEC sp_executesql @stmt

Die zu löschenden Spalten sind also in der Tabelle dbo.tdAttributeValues und die Namen der Spalten lassen sich aus dbo.tdAttributes.AttributeName herleiten (fixes Präfix Attr_). Die Idee liegt nahe, alle notwendigen ALTER TABLE Befehle zuerst in einem String (@stmt) zusammen zu fassen und anschliessend diesen String mittels sp_executesql auszuführen. Leider kann ich einem String nicht mehrere Ergebniszeilen eines SELECT-Kommandos zuweisen. Ich muss also alle Zeilen (gleichbedeutend mit alle ALTER TABLE Kommandos) in einer einzigen Zeile zusammenfassen. Genau das macht FOR XML. as [text()] und PATH() sorgen lediglich für die korrekte Formatierung. That’s it! Viel Spass beim adaptieren meiner Lösung für deine Problemstellungen.

Advertisements

3 Kommentare »

  1. wird wohl nur bei 2005 funktionieren?

    Kommentar von dataCore — 26. Oktober 2007 @ 11:53

  2. Ich denke mit NUR meinst du NICHT SQL Server 2000.
    Ja, dem ist leider so. SQL Server 2000 kennt eine FOR XML Klausel in der From leider noch nicht.

    Kommentar von Urs Gehrig — 29. Oktober 2007 @ 10:19

  3. Hallo zusammen,

    das ganze funktioniert auch unter SQL 2000.

    EXECUTE(‚Select * from FROM [‚ + @Temptable_Name +‘] WHERE Name ‚ + @Name + ‚)

    Gruß Chris

    Kommentar von Chris — 30. November 2007 @ 17:24


RSS feed for comments on this post. TrackBack URI

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Bloggen auf WordPress.com.

%d Bloggern gefällt das: