Angenommen, Sie haben eine gespeicherte Prozedur und einen optionalen Parameter. Sie möchten diesen optionalen Parameter in der SQL-Abfrage verwenden. Normalerweise ist dies, wie ich habe es getan gesehen:Korrekte Möglichkeit, 'optionale' Where-Klausel-Filter in SQL zu behandeln?
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND (@MyOptionalParam IS NULL OR t1.MyField = @MyOptionalParam)
Diese gut zu funktionieren scheint, aber es verursacht eine hohe Menge an logischen liest, wenn Sie die Abfrage mit STATISTICS IO ON laufen. Ich habe auch die folgende Variante ausprobiert:
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND t1.MyField = CASE WHEN @MyOptionalParam IS NULL THEN t1.MyField ELSE @MyOptionalParam END
Und es ergibt die gleiche Anzahl von hohen liest. Wenn wir die SQL in eine Zeichenfolge konvertieren, dann rufen Sp_executesql darauf, die liest sind fast gleich Null:
DECLARE @sql nvarchar(max)
SELECT @sql = 'SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = ''test'''
IF @MyOptionalParam IS NOT NULL
BEGIN
SELECT @sql = @sql + ' AND t1.MyField = @MyOptionalParam '
END
EXECUTE sp_ExecuteSQL @sql, N'@MyOptionalParam', @MyOptionalParam
Bin ich verrückt? Warum sind optionale Wo-Klauseln so schwer zu bekommen?
Update: Ich frage im Grunde, ob es eine Möglichkeit gibt, die Standardsyntax innerhalb einer gespeicherten Prozedur zu behalten und niedrige logische Lesevorgänge zu erhalten, wie die sp_ExecuteSql-Methode. Es scheint völlig verrückt zu sein, eine Zeichenkette aufzubauen ... ganz zu schweigen davon, dass es schwieriger zu warten, zu debuggen, zu visualisieren ist.
Nicholas, siehe die Union-Ansatz unten für eine Möglichkeit zur Verwendung von Standard-SQL-Syntax ohne dynamische sql - Ich wäre sehr gespannt auf Sie sehen, wie es in Ihrem Szenario funktioniert ... – chadhoc
@Nicholas: Erstellen einer Abfrage als Eine Zeichenkette vor der Ausführung ist ** genau ** was * dynamisch * SQL ist. Es ist ein kleines Problem zu debuggen - kopieren/einfügen, String-Verkettungssyntax loszuwerden. –