处理null参数的存储过程

时间:2010-06-22 22:16:50

标签: sql-server null

我确信这有一个非常简单的答案我没有找到...我在数据库中有一个简单的层次结构,其中每一行都有一个ParentId。如果ParentId IS NULL,则它是根元素。我有存储过程:

CREATE PROCEDURE GetByParent @parentId int
AS BEGIN SELECT * FROM TABLE1 WHERE ParentId = @parentId END

如果我发送一个整数,它工作正常,但如果我发送NULL它变为ParentId = NULL,这在ANSI中不起作用。我知道有COALESCE(@parentId, ParentId),但在@parentId IS NULL时会返回所有行。我可以执行IF ELSE语句并复制查询(一个使用= @parentId,另一个使用IS NULL),但我确信有更好的方法。

4 个答案:

答案 0 :(得分:6)

在单独的条件下处理NULL情况:

SELECT *
FROM TABLE1
WHERE ParentId = @parentId
    OR (ParentId IS NULL AND @parentId IS NULL)

答案 1 :(得分:3)

实际上,IF / ELSE方法是使用动态SQL的最佳性能。假设SQL Server 2005+,您将使用:

DECLARE @SQL NVARCHAR(max)
   SET @SQL = 'SELECT * FROM TABLE1 WHERE 1=1 '

   SET @SQL = CASE 
                WHEN @parentid IS NULL THEN ' AND parentid IS NULL '
                ELSE ' AND parentid = @parentid '
              END

BEGIN

  EXEC sp_executesql @SQL, N'parentid INT', @parentid

END

强制性IF / ELSE:

BEGIN

  IF @parentid IS NULL
  BEGIN
    SELECT * FROM TABLE1 WHERE parentid IS NULL 
  END
  ELSE
  BEGIN
    SELECT * FROM TABLE1 WHERE parentid = @parentid
  END

END

答案 2 :(得分:3)

我假设您没有对parentID使用否定ID。

如果您使用两个ISNULL语句,则可以在一个查询中涵盖所有案例:

SELECT * FROM TABLE1 WHERE ISNULL(ParentId,-1) = ISNULL(@parentId,-1)

这种方式当@parentid为NULL时,它只返回空值而不是所有行的结果。

答案 3 :(得分:1)

你可以使用OR语句

... WHERE (@parentId IS NULL AND ParentId IS NULL) OR ParentId=@parentId