Ich habe ein paar gespeicherte Prozeduren, die dynamisches SQL verwenden. Ich möchte sie wirklich ändern, so dass sie nicht dynamisch sind, nur weil sie wegen der Fehlerbehandlung sehr lästig sein können, Fehler zu beheben und zu ändern (das Klicken auf die Fehlermeldung führt Sie nicht zu dem Fehler). Ich weiß, dass ich den Text auswählen und es als reguläres SQL einfügen kann, um dabei zu helfen, aber es ist ziemlich frustrierend.Alternative zu dynamischem SQL
Das Problem dabei ist, dass die Abfragen viel langsamer ablaufen, wenn sie nicht dynamisch sind. Insbesondere ist die where-Klausel aufgrund ihrer erhöhten Flexibilität in der dynamischen Abfrage viel schneller. Zum Beispiel würde die statische where-Klausel wie etwas sein:
where
SomeColumn = case when @variable1 = 0 then SomeColumn else @variable1 end
and(
(@variable2 = -2 and SomeColumn2 = 1)
or (@variable2 = -1)
or (@variable2 = 0 and SomeColumn2 = 0 and SomeColumn3 = 0)
or (@variable2 = 1 and SomeColumn2 = 0 and SomeColumn3 > 0)
)
Aber die dynamische where-Klausel wäre:
where ' + @SomeCondition + @SomeCondition2 + '
eine Case-Anweisung wie folgt aus:
declare @SomeCondition nvarchar(max) = case
when @variable3 = -2 then N'Condition 1'
when @variable3 = 0 then N'Condition 2'
when @variable3 = 1 then N'Condition 3'
else N''
end
die einzige Lösung, die ich mir vorstellen kann, ist mit mehreren if
Anweisungen und nur die WHERE-Klausel in jeder Anweisung ändern, aber das scheint unglaublich verschwenderisch und zeitaufwendig.
Gibt es noch andere Alternativen zu dynamischem SQL? Fehlt das, kann ich etwas tun, um den SQL-Server dazu zu bringen, mich richtig auf den Fehler zu verweisen?
Verwenden Sie 'try' /' catch', um die durch das dynamische SQL verursachten Fehler zu erhalten? Vielleicht hilft das Beheben der Fehlerbehandlung, was Sie brauchen. Sogar mehrere 'if's können problematisch sein, wenn Sie nicht die Option' rekompilieren' verwenden. –
Das wäre sehr hilfreich, die frustrierende Fehlerbehandlung ist eigentlich der einzige Grund, warum ich die dynamischen Abfragen ändern möchte. Würde ich einfach try/catch innerhalb der Variablen verwenden, die das SQL enthält, oder muss es außerhalb davon geschrieben werden? Ich bin mir nicht ganz sicher, wie ich mit dynamischem SQL vorgehen soll. –
Sie könnten spezialisierte, optimierte Prozeduren erstellen und dann die richtige auf Basis Ihrer Parameter aufrufen, um die OR-Bedingungen zu vermeiden. Aber dann müssen Sie mehr Prozeduren verwalten. Meiner Erfahrung nach werden Sie nie eine "one-size-fits-all" -Abfrage (or-or-or-or-Muster im where) sowie dynamische oder spezialisierte Abfragen erhalten. –