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.



