2016-08-18 2 views
2

Почему это невозможно в SQL Server?Где запрос с параметром NULL

Я получаю:

Неправильный синтаксис около '@pp'.

SQL:

declare @pp INT = null 

select * 
from ExtraExaminationsReportView 
where [PayerId] is @pp 
+2

Вы не можете параметризовать ключевые слова, вы можете попытаться сделать свой динамический запрос вместо – Petaflop

+1

, почему вы хотите сделать это таким образом? вы не можете изменить '@ pp', например, 4. Ваш запрос будет 'где [PayerId] равен 4', что совершенно неверно. –

ответ

1

Синтаксис, который вы написали, не будет работать по нескольким причинам.

Во-первых, если @pp был int, синтаксис IS @PP неверен, IS синтаксис используется в сочетании с NULL:

SELECT * FROM TABLE WHERE COL IS NULL 

Вы не можете сделать:

SELECT * FROM TABLE WHERE COL IS 1 

Вы хотите необходимо использовать = при проверке на числовое значение:

SELECT * FROM TABLE WHERE COL = 1 

Таким образом, чтобы удовлетворить как значение NULL или значение INT, вы можете использовать OR в пункте WHERE проверить значение, как так:

DECLARE @pp INT = NULL -- you can set this to 1 to show it works for both 

-- temp table with a null value and an int value = 1 
SELECT 1 val 
INTO #TMP 
UNION ALL 
SELECT NULL 

SELECT * 
FROM #TMP 
WHERE (@pp IS NULL 
      AND val IS NULL 
     ) 
     OR (@pp IS NOT NULL 
      AND val = @pp 
      ) 

DROP TABLE #TMP 

Изменение кода:

DECLARE @pp INT = NULL 

SELECT * 
FROM ExtraExaminationsReportView 
WHERE (@pp IS NULL 
      AND PayerId IS NULL 
     ) 
     OR (@pp IS NOT NULL 
      AND PayerId = @pp 
      ) 
1

Вы должны изменить логику запроса. Единственный способ:

declare @pp INT = null 
select * from ExtraExaminationsReportView where ([PayerId] IS NULL OR [PayerId] = @pp) 
+0

проблема с вашим запросом заключается в том, что если '@ pp' является числом, то вы также будете возвращать строки, где' playerId' является 'null', что может быть нежелательно. – Tanner