为什么在SQL Server中这是不可能的?用NULL参数查询
我越来越:
附近有语法错误@pp“。
SQL:
declare @pp INT = null
select *
from ExtraExaminationsReportView
where [PayerId] is @pp
为什么在SQL Server中这是不可能的?用NULL参数查询
我越来越:
附近有语法错误@pp“。
SQL:
declare @pp INT = null
select *
from ExtraExaminationsReportView
where [PayerId] is @pp
您编写的语法不起作用的原因有几个。
首先,如果@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
)
你必须改变你的查询逻辑。唯一的办法是:
declare @pp INT = null
select * from ExtraExaminationsReportView where ([PayerId] IS NULL OR [PayerId] = @pp)
你的查询的问题是,如果'@ pp'是一个数字,那么你也将返回'playerId'为'null'的行,这可能不是你想要的。 – Tanner
你不能参数化关键字,你可以尝试让你的查询动态地改为 – Petaflop
为什么你想这样做?你不能把'@ pp'改成例如4.你的查询将是'哪里[PayerId]是4',这是明确错误的。 –