Хранимая процедура для обработки нулевого параметра - PullRequest
2 голосов
/ 23 июня 2010

Я уверен, что это очень простой ответ, которого я не нахожу ... У меня есть простая иерархия в базе данных, где каждая строка имеет 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 ]

6 голосов
/ 23 июня 2010

Обрабатывать NULL-кейс в отдельном состоянии:

SELECT *
FROM TABLE1
WHERE ParentId = @parentId
    OR (ParentId IS NULL AND @parentId IS NULL)
3 голосов
/ 23 июня 2010

Я предполагаю, что вы не используете отрицательные идентификаторы для parentID.

Если вы используете два оператора ISNULL, вы можете охватить все случаи одним запросом:

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

Таким образом, когда @parentid IS NULL, он будет возвращать результаты только с нулевыми значениями, а не со всеми строками.

3 голосов
/ 23 июня 2010

На самом деле, метод 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
1 голос
/ 23 июня 2010

Вы можете просто использовать оператор OR

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

...