Es ist nichts Falsches daran, dynamisches SQL zu verwenden, wenn Sie müssen. In der Tat ist es unter bestimmten Umständen die einzige Option, die Sie haben. Es ist eher eine Empfehlung, es nicht zu verwenden, da es zu einer SQL-Injection führen kann, wenn Ihre Eingabe nicht bereinigt wird. Ja, die Verwendung von dynamischem SQL in Modulen, die häufig aufgerufen werden, kann sich nachteilig auf die Leistung auswirken.
Ich glaube nicht, dass es per se ein konkretes Beispiel gibt, aber ich würde Folgendes sagen: Versuchen Sie, das zu erreichen, was Sie sind, nachdem Sie zuerst regelmäßige Abfragen und Anweisungen verwendet haben - erst dann, wenn Sie alle anderen Möglichkeiten ausgeschöpft haben, tun Sie dies dynamisch. Denken Sie daran, dass die Ausführung einer dynamischen SQL-Zeichenfolge in einer separaten Benutzersitzung zu dem Modul erfolgt, das sie aufruft. Daher können Berechtigungsprobleme auftreten, bei denen Sie keine erwarten.
Wenn Sie sich Sorgen um die Leistung machen; Probier es aus. Wenn Sie sich Sorgen um die Sicherheit machen; Überprüfen Sie Ihre Eingabe. Es gibt kein Richtig oder Falsch - nur, dass Sie Ihr bestes Urteilsvermögen auf der Grundlage der Informationen und Tools verwenden, die Ihnen zu diesem Zeitpunkt zur Verfügung stehen.
Es ist wie bei den meisten DBMS-Funktionen. Wenn Sie es in der richtigen Situation verwenden, funktioniert es gut, in der falschen Situation schlecht.
Vorteile: Manche Dinge können ohne sie einfach nicht gemacht werden. Normalerweise habe ich festgestellt, dass dies nur für Verwaltungsarbeiten und nicht für Anwendungscode gedacht ist. Bei einigen Systembefehlen können Parameter nicht als Eingabe verwendet werden. Wenn ich beispielsweise in vielen Fällen mit unbekannten Datenbanken für jede Datenbank etwas über einen Sproc ausführen muss und der Befehl keine Parameter akzeptiert, löse ich dies normalerweise über dynamisches SQL. Dies ist jedoch in Sybase ASE eher eine Sache als in MSSQL.
Nachteile: Ich werde nicht viel darauf eingehen, da ich denke, dass wir es alle bereits wissen, aber es kann ein gewisses Risiko für die SQL-Injection bestehen, wenn sie falsch verwendet wird. Das Größere für mich ist, dass die Abfrage so behandelt wird, wie sie ist, eine eindeutige Ad-hoc-Abfrage und nicht Teil des kompilierten Abfrageplans. Für etwas, das gelegentlich läuft, keine große Sache. Für etwas, das hunderte Male pro Minute ausgeführt wird und viele eindeutige SQL-Werte aufweist, werden viele neue, möglicherweise unnötige Abfragepläne generiert, die Zyklen verschlingen und die gültige Zeit des Plan-Cache verkürzen.
quelle
Verwenden Sie kein dynamisches SQL.
In 99% der Fälle wird Dynamic SQL verwendet, da keine Kenntnisse über die Verwendung optionaler Parameter in gespeicherten Prozeduren vorhanden sind. In den restlichen 1% der Fälle wird eine hochkomplexe Abfrage für einen Bericht erstellt, den der Kunde nicht versteht sogar. Der Fluch und der Segen von Dynamic SQL zeigen kein Beispiel dafür, warum es eine gute Idee wäre, es zu verwenden, sondern legen lediglich nahe, dass es problematisch ist, da es die Komplexität beim Debuggen, Verwalten und ganz zu schweigen von den Sicherheitsrisiken von SQL erhöht Injection, schlechte Leistung, nicht weil der Cache, sondern die damit verbundenen schlechten Praktiken wie die Verwendung temporärer Tabellen und Cursor, die natürlich faul und naiv sindProgrammierer würde Missbrauch von. Es gibt keine Flexibilität, Abfragen auf diese Weise zu schreiben. SQL ist eine deklarative Sprache und sollte als solche behandelt werden.
Faulheit ist die Wurzel allen Übels.
Paradoxerweise wird diese Antwort zu den am schlechtesten bewerteten zählen .
quelle