Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 箱子坏了_Sql Server - Fatal编程技术网

Sql server 箱子坏了

Sql server 箱子坏了,sql-server,Sql Server,我有以下两个问题。第一个查询是直截了当的,当@MyParam为null时,它作为epecte工作。但是第二个查询并没有返回相同的结果。第二个查询中的错误是什么 注意:自从客户端要求取消“@MyParam IS NULL”检查(用于查询1)以来,我一直被要求使用第二种方法 查询 DECLARE @MyParam INT DECLARE @MyTable TABLE (EmpID INT) INSERT INTO @MyTable VALUES (1) INSERT INTO @MyTable

我有以下两个问题。第一个查询是直截了当的,当@MyParam为null时,它作为epecte工作。但是第二个查询并没有返回相同的结果。第二个查询中的错误是什么

注意:自从客户端要求取消“@MyParam IS NULL”检查(用于查询1)以来,我一直被要求使用第二种方法

查询

DECLARE @MyParam INT

DECLARE @MyTable TABLE (EmpID INT)

INSERT INTO @MyTable VALUES (1)
INSERT INTO @MyTable VALUES (2)
INSERT INTO @MyTable VALUES (3)
INSERT INTO @MyTable VALUES (4)

--Query 1
SELECT * 
FROM @MyTable M
WHERE M.EmpID = @MyParam OR @MyParam IS NULL

-- Query 2 (Rewrite for performance)
SELECT * 
FROM @MyTable M
WHERE M.EmpID = (CASE @MyParam WHEN NULL THEN M.EmpID ELSE @MyParam END)

当@MyParam为NULL时,语法为
大小写,然后是M.EmpID ELSE@MyParam END

请参见此处的类似答案:


语法为
当@MyParam为NULL时,则为M.EmpID ELSE@MyParam END

请参见此处的类似答案:

你可以写

SELECT * 
FROM @MyTable M
WHERE M.EmpID = IsNULL(@MyParam,M.EmpID)
或者如果出于其他原因需要使用
案例

WHERE M.EmpID = (CASE WHEN @MyParam IS NULL THEN M.EmpID ELSE @MyParam END)
箱子运转正常。选择没有被破坏

你可以写

SELECT * 
FROM @MyTable M
WHERE M.EmpID = IsNULL(@MyParam,M.EmpID)
或者如果出于其他原因需要使用
案例

WHERE M.EmpID = (CASE WHEN @MyParam IS NULL THEN M.EmpID ELSE @MyParam END)

箱子运转正常。选择没有被破坏

您应该使用的是NOTNULL。永远不要将NULL与任何东西进行比较

NULL=NULL - > false
NULL <> NULL -> false
NULL=NULL->false
空->假

您应该使用的值不为空。永远不要将NULL与任何东西进行比较

NULL=NULL - > false
NULL <> NULL -> false
NULL=NULL->false
空->假
为什么不直接使用

SELECT * 
FROM @MyTable M
WHERE M.EmpID = ISNULL(@MyParam, M.EmpID)
或者,如果您寻求的是性能,请使用
if
语句检查
@MyParam

IF @MyParam IS NULL THEN
  SELECT * FROM @MyTable
ELSE
  SELECT * FROM @MyTable WHERE EmpID = @MyParam
为什么不直接使用

SELECT * 
FROM @MyTable M
WHERE M.EmpID = ISNULL(@MyParam, M.EmpID)
或者,如果您寻求的是性能,请使用
if
语句检查
@MyParam

IF @MyParam IS NULL THEN
  SELECT * FROM @MyTable
ELSE
  SELECT * FROM @MyTable WHERE EmpID = @MyParam
为此,我将使用
coalesce()
。这是短路的ANSI标准方法:

SELECT m.* 
FROM @MyTable m
WHERE m.EmpID = coalesce(@MyParam, m.EmpID);
注意,在m.EmpId为
NULL
的情况下,此逻辑与第一种方法有细微的不同。等效逻辑为:

SELECT m.* 
FROM @MyTable m
WHERE m.EmpID = coalesce(@MyParam, m.EmpID) or (m.EmpId is NULL and @MyParam is NULL);
为此,我将使用
coalesce()
。这是短路的ANSI标准方法:

SELECT m.* 
FROM @MyTable m
WHERE m.EmpID = coalesce(@MyParam, m.EmpID);
注意,在m.EmpId为
NULL
的情况下,此逻辑与第一种方法有细微的不同。等效逻辑为:

SELECT m.* 
FROM @MyTable m
WHERE m.EmpID = coalesce(@MyParam, m.EmpID) or (m.EmpId is NULL and @MyParam is NULL);

这并不总是正确的。is关键字是比较器…这并不总是正确的。is关键字是比较器…谢谢。标记为答案的。我有一个相关的问题,谢谢。标记为答案的。我有一个相关的问题