Wie kann ich eine Abfrage ausführen, wenn sowohl der Spaltenname als auch der Tabellenname übergeben werden?

StackOverflow https://stackoverflow.com/questions/998374

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).

War es hilfreich?

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 oder Exec() 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.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top