Supponiamo che tu abbia una stored procedure e che abbia un parametro opzionale. Si desidera utilizzare questo parametro facoltativo nella query SQL. In genere questo è come ho visto fare:Modo corretto per gestire 'opzionale' dove la clausola filtra in SQL?
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND (@MyOptionalParam IS NULL OR t1.MyField = @MyOptionalParam)
Questo sembra funzionare bene, tuttavia provoca una quantità elevata di letture logiche se si esegue la query con STATISTICS IO ON. Ho anche provato la seguente variante:
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND t1.MyField = CASE WHEN @MyOptionalParam IS NULL THEN t1.MyField ELSE @MyOptionalParam END
E produce lo stesso numero di letture alte. Se convertiamo lo SQL in una stringa, quindi chiamare sp_executesql su di esso, le letture sono quasi nulle:
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
Sono pazzo? Perché le clausole opzionali sono così difficili da ottenere?
Aggiornamento: Sto praticamente chiedendo se c'è un modo per mantenere la sintassi standard all'interno di una stored procedure e ottenere letture logiche basse, come fa il metodo sp_ExecuteSql. Mi sembra completamente pazzo costruire una stringa ... per non parlare rende più difficile mantenere, eseguire il debug, visualizzare ..
Nicholas, vedi l'approccio unione qui sotto per un modo di utilizzare la sintassi sql standard senza sql dinamico - Sarei molto curioso di vederti pubblicare sul suo rendimento nel tuo scenario ... – chadhoc
@Nicholas: Costruire una query come una stringa prima dell'esecuzione è ** esattamente ** che cos'è * dynamic * SQL. È un problema secondario per il debug: copia/incolla, eliminazione della sintassi della concatenazione delle stringhe. –