Wie kann ich eine Abfrage ausführen, wenn sowohl der Spaltenname als auch der Tabellenname übergeben werden?
-
14-09-2019 - |
Frage
Kann ich bei einem Tabellennamen und Spaltennamen in einem Variablenpaar eine Auswahlabfrage ohne dynamische SQL ausführen?
Zum Beispiel hätte ich etwas schöner als das:
CREATE PROCEDURE spTest (@table NVARCHAR(30), @column NVARCHAR(30)) AS
DECLARE @sql NVARCHAR(2000)
SELECT @sql = N'SELECT ' + @column + N' FROM ' + @table
PRINT @sql
EXEC sp_executesql @sql
Ich würde dies gerne tun, weil meine dynamische SQL-Version 3x langsamer ist als die nicht-dynamische Version (die einen programmierbaren Tabellen-/Spaltennamen nicht unterstützt, daher diese Frage).
Lösung
Die dynamische Version wird 3x langsamer sein, nur weil Sie den Tabellennamen ein- und aus austauschen werden und der Parser dafür nicht optimieren kann.
Möglicherweise möchten Sie eine Art verschachtelte Switch-Anweisung in Ihrer Routine verwenden und diese verwenden, um Ihre SELECT-Anweisung aus vordefinierten Tabellen/Spalten auszuwählen, insbesondere wenn Ihr Schema nicht häufig geändert wird. Das sollte viel schneller laufen, aber Sie werden die wahre Dynamik verlieren.
Andere Tipps
Es hört sich also so an, als ob die Frage ist, ob Sie eine Abfrage zur Laufzeit erstellen und ausführen können, ohne dynamische SQL zu verwenden.
Ich würde sagen, die Antwort ist nein. Die Entscheidungen sind:
- Dynamisches SQL - Anruf
sp_ExecuteSQL
oderExec()
Bei einer vom Benutzer gebauten Zeichenfolge. Egal, ob dies Pass-Through-SQL mit einer ADO-Bibliothek und einem Befehlsobjekt oder in einem SPOC-Richtige liegt. - Kompiliertes SQL - Verwenden der üblichen Objekte (Sprocs und UDF) mit bekannten guten Aussagen, die mit bekannten guten Objekten interagieren. Die Parsen erfolgt zuvor in diesem Fall.