Допустим, у вас есть хранимая процедура, и она принимает необязательный параметр. Вы хотите использовать этот необязательный параметр в запросе SQL. Как правило, вот как я это сделал:
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND (@MyOptionalParam IS NULL OR t1.MyField = @MyOptionalParam)
Кажется, это работает хорошо, однако вызывает большое количество логических чтений, если вы выполняете запрос с STATISTICS IO ON. Я также попробовал следующий вариант:
SELECT * FROM dbo.MyTableName t1
WHERE t1.ThisField = 'test'
AND t1.MyField = CASE WHEN @MyOptionalParam IS NULL THEN t1.MyField ELSE @MyOptionalParam END
И это дает такое же количество высоких чтений. Если мы преобразуем SQL в строку, затем вызовем sp_ExecuteSQL для нее, чтение будет почти равно нулю:
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
Я сумасшедший? Почему факультативно, когда пункты так трудно получить правильно?
Обновление: Я просто спрашиваю, есть ли способ сохранить стандартный синтаксис внутри хранимой процедуры и получить низкое логическое чтение, как это делает метод sp_ExecuteSql. Мне кажется совершенно безумным создание строки ... не говоря уже о том, что ее сложнее поддерживать, отлаживать, визуализировать ..