Параметр null хранимой процедуры
у меня есть таблица базы данных, в которую я пытаюсь выполнить обновление/вставку с помощью хранимой процедуры. Давайте определим таблицу так:
CREATE TABLE Foo
(
Id INT IDENTITY(1, 1),
Name VARCHAR(256) NOT NULL,
ShortName VARCHAR(32),
Sort INT
);
Я написал хранимую процедуру, подобную следующей:
CREATE PROCEDURE Put_Foo
(
@Id INT = NULL OUTPUT,
@Name VARCHAR(256),
@ShortName VARCHAR(32) = NULL,
@Sort INT = NULL
)
AS
BEGIN
SET NOCOUNT ON;
SELECT
@Id = F.Id
FROM
Foo AS F
WHERE
F.Name = @Name;
IF (@Id IS NOT NULL)
BEGIN
UPDATE
Foo
SET
ShortName = @ShortName,
Sort = @Sort
WHERE
Id = @Id;
END
ELSE
BEGIN
INSERT
INTO Foo
(
Name,
ShortName,
Sort
)
VALUES
(
@Name,
@ShortName
@Sort
);
SET @Id = SCOPE_IDENTITY();
END
RETURN;
END;
Я значительно упростил структуры данных, с которыми имею дело, но я надеюсь, что это служит моей точке зрения. Мой вопрос касается того, как обрабатываются параметры. Есть ли способ определить в рамках процедуры, был ли @Sort передан как NULL или установлен NULL по объявлению по умолчанию в списке параметров?
EDIT:
цель этого заключается в том, что я не хочу, чтобы нулевые параметры переопределяли любые столбцы в инструкции UPDATE, если они явно не передаются таким образом.
3 ответов
нет, вы не можете определить, как @Sort стал NULL. Если ваша цель-захватить, когда он явно установлен по умолчанию, я бы предложил использовать другое значение по умолчанию (возможно, то, которое обычно не используется, например -1). Тогда вы можете предположить, что если @Sort равен NULL, он был явно передан, но если он равен -1, вы знаете, что он был установлен по умолчанию.
Я думаю, что это то, что ищете. Если один из параметров равен null, он будет updatedit со значением в базе данных. Другой вариант-обновлять по одному столбцу за раз.
UPDATE Foo
SET
ShortName = ISNULL(@ShortName, ShortName)
, Sort = ISNULL(@Sort, Sort)
WHERE Id = @Id;
выньте значение по умолчанию, а затем код, вызывающий proc, должен предоставить значение (либо реальное значение, либо NULL)