Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация кода  [new]
Barmaqlot
Member

Откуда:
Сообщений: 6
Уважаемые гуру MS SQL!

Для отчета в SSRS мне необходимо внутри SQL-запроса создать фильтр с условием:
- если значение переменной "NULL", то игнорировать фильтр
- иначе, если значение вводится, то запрос должен учитывать фильтр по данной переменной

Составила следующий запрос:

USE dbCompany
GO

DECLARE @Code INT
SET @Code=null; -- or put any integer value

DECLARE @Sql NVARCHAR(MAX) = 'SELECT * FROM dbo.Shops AS S WHERE 1=1'

IF @Code IS NOT NULL
BEGIN
SET @Sql = @Sql + ' AND S.Code > @Code'
END

EXEC sp_executesql @Sql, N'@Code INT', @Code = @Code


Начальник же сказал, что есть возможность оптимизировать данный вариант. Посоветуйте что-нибудь!

Отмечу, что реальный запрос довольно внушительный и фильтр производится как минимум по 12-ти параметрам.

Заранее благодарю!
8 янв 13, 10:23    [13735238]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация кода  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Тема поднимается довольно часто.

https://www.sql.ru/forum/actualthread.aspx?tid=994721
https://www.sql.ru/faq/faq_topic.aspx?fid=114

DECLARE @Code INT
SET @Code = ...

SELECT * FROM dbo.Shops AS S WHERE S.Code > @Code OR @Code IS NULL
OPTION(RECOMPILE)
 
8 янв 13, 10:42    [13735261]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация кода  [new]
Yagrus2
Member

Откуда: Москва
Сообщений: 895
Jovanny,
Попробуйте написать условие через кейс, например так
SELECT * FROM  dbo.Shops AS S
WHERE CASE WHEN  @Code IS NULL OR Code = @Code THEN 1 ELSE 0 END = 1 
8 янв 13, 11:48    [13735363]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация кода  [new]
Barmaqlot
Member

Откуда:
Сообщений: 6
Jovanny, Yagrus2, огромное вам спасибо!!! Вы мне сильно помогли!
9 янв 13, 09:29    [13739356]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация кода  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
А я бы подумал над этим
SELECT * FROM
возможно не все столбцы нужны в запросе, а можно использовать только ограниченный набор. Ну и покрывающий индекс по Code, если он имеет смысл.
9 янв 13, 10:09    [13739522]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить