2016-08-18 42 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值,你可以使用一个ORWHERE子句中的检查,像这样的值:

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