TSQL - сделай лучше - PullRequest
       9

TSQL - сделай лучше

1 голос
/ 11 мая 2010

У меня следующий TSQL, передаются 3 идентификатора (@EmpID, @DeptID и @CityID), и все они могут иметь значение NULL или любой из них может быть NULL Смотрите следующий сценарий:


-- Very Narrow (all IDs are passed in)
IF(@EmpID IS NOT NULL AND @DeptID IS NOT NULL AND @CityID IS NOT NULL)
   BEGIN    
      SELECT
         e.EmpName 
         ,d.DeptName
         ,c.CityName
      FROM
         Employee e WITH (NOLOCK)
         JOIN Department d WITH (NOLOCK) ON e.deptid = d.deptid
         JOIN City c WITH (NOLOCK) ON e.CityID = c.CityID
      WHERE 
         e.EmpID = @EmpID
   END
-- Just 2 IDs passed in
ELSE IF(@DeptID IS NOT NULL AND @CityID IS NOT NULL)
   BEGIN
      SELECT
         e.EmpName 
         ,d.DeptName
         ,NULL AS [CityName]
      FROM
         Employee e WITH (NOLOCK)
         JOIN Department d WITH (NOLOCK) ON e.deptid = d.deptid
         JOIN City c WITH (NOLOCK) ON e.CityID = c.CityID
      WHERE 
         d.deptID = @DeptID
   END
-- Very Broad (just 1 ID passed in)
ELSE IF(@CityID IS NOT NULL)
   BEGIN
      SELECT
         e.EmpName 
         ,NULL AS [DeptName]
         ,NULL AS [CityName]
      FROM
         Employee e WITH (NOLOCK)
         JOIN Department d WITH (NOLOCK) ON e.deptid = d.deptid
         JOIN City c WITH (NOLOCK) ON e.CityID = c.CityID
      WHERE 
         c.CityID = @CityID
   END
-- None (Nothing passed in)
ELSE 
   BEGIN
      SELECT
         NULL AS [EmpName]
         ,NULL AS [DeptName]
         ,NULL AS [CityName]
   END


Вопрос: Есть ли какой-нибудь лучший способ (ИЛИ, в частности, я могу сделать что-нибудь без условия ЕСЛИ ... ДАЛЕЕ?

1 Ответ

1 голос
/ 11 мая 2010

Есть много способов сделать это. ключ заключается в создании запроса, который будет использовать индекс.

Некоторые из распространенных:
x = @x ИЛИ @x ЕСТЬ НУЛЬ
Использование операторов IF
устранить нули, используя минимальное и максимальное значения
Динамический SQL
OPTION (RECOMPILE) в некоторых версиях SQL Server 2008

Эта ссылка объяснит эти и некоторые другие: http://www.sommarskog.se/dyn-search.html

Посмотрите на предыдущие, но похожие вопросы:
Оптимальные поисковые запросы

Реализация функции поиска с несколькими необязательными параметрами для таблицы базы данных

В вашем конкретном примере кода вы можете добавить dbo. или какая бы схема не использовалась для каждого имени таблицы, чтобы каждый пользователь не получал свою собственную версию в кеше, см .: http://www.sommarskog.se/dynamic_sql.html#queryplans

Возможно, вам также придется беспокоиться о сниффинге параметров, см. http://www.sommarskog.se/dyn-search-2005.html#OR_ISNULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...