T-SQL: динамическое предложение «Где» в обычном операторе SQL - PullRequest
0 голосов
/ 24 марта 2010

Я ищу способ динамически добавить фильтр в свою статистику без использования динамического SQL.

Я хочу выбрать все компьютеры из таблицы, но когда я передаю идентификатор компьютера в sp, я хочучтобы получить только этот компьютер.

На самом деле, я пробую это на

DECLARE @ComputerFilter AS INT
DECLARE @ComputerID AS INT

SELECT Computername 
FROM   Computer
WHERE  (ComputerID = @ComputerID) OR (@ComputerFilter IS NULL))

Но это в 100 раз медленнее, чем этот статус и тусует, пока SELECT * FROM Computer

SELECT Computername 
FROM   Computer
WHERE  ComputerID = @ComputerID

Есть лиспособ ускорить этот статус или есть ли другой способ решить эту проблему с одним выбором и без динамического SQL?

Ответы [ 5 ]

4 голосов
/ 24 марта 2010

Самый простой способ - использовать оператор IF.

IF @ComputerID IS NULL BEGIN
  SELECT Computername 
  FROM   Computer
END
ELSE BEGIN
  SELECT Computername 
  FROM   Computer
  WHERE  ComputerID = @ComputerID
END
1 голос
/ 24 марта 2010

ОБЪЯВИТЬ @ComputerID AS INT

SET @ComputerID  = null -- fro all null or just id for one

SELECT Computername 
FROM   Computer
WHERE  ComputerID = ISNULL( @ComputerID, ComputerID  )

Когда вам не нужно

0 голосов
/ 24 марта 2010

Для этого не существует подхода к запросу "один размер подходит всем", а то, как вы это делаете, имеет незначительные последствия для производительности. Если вы хотите выйти за рамки простого запроса правильного ответа, независимо от того, насколько он медленный, посмотрите на эту статью по Условия динамического поиска в T-SQL, Эрланд Соммарског

0 голосов
/ 24 марта 2010

У вас есть индексирование на столе? Это должно помочь производительности.

0 голосов
/ 24 марта 2010

SQL Server часто плохо оптимизирует запросы с OR в предложении WHERE. Иногда UNION или UNION ALL лучше. В вашем случае сначала выполните проверку @ComputerFilter IS NULL в операторе IF, и просто выполните SELECT без WHERE, если верно ...

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