Получить SQL INSERT на работу, когда PK поставляется или нет
-
28-09-2019 - |
Вопрос
У меня есть следующая хранимая процедура:
ALTER Procedure dbo.APPL_ServerEnvironmentInsert
(
@ServerEnvironmentName varchar(50),
@ServerEnvironmentDescription varchar(1000),
@UserCreatedId uniqueidentifier,
@ServerEnvironmentId uniqueidentifier OUTPUT
)
WITH RECOMPILE
AS
-- Stores the ServerEnvironmentId.
DECLARE @APPL_ServerEnvironment TABLE (ServerEnvironmentId uniqueidentifier)
-- Insert the data into the table.
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
-- If @ServerEnvironmentId was not supplied.
IF (@ServerEnvironmentId IS NULL)
BEGIN
-- Get the ServerEnvironmentId.
SELECT @ServerEnvironmentId = ServerEnvironmentId
FROM @APPL_ServerEnvironment
END
Столбец ServerEnvironmentiD является первичным ключом с настроенным набором по умолчанию, который является (NewsexentiD ()).
Мне нужна эта сохраненная процедура для работы на 2 сценария:
- Значение, поставляемое для ServerEnvironmentiD - работает.
- Значение, не поставляемое для ServerEnvironmentID - не работает - не может вставить нулевое значение. Я думал, устанавливая по умолчанию на этом столбце, это было бы в порядке.
Кто-то, пожалуйста, помогите помнить эту процедуру, чтобы она могла работать как для обоих сценариев. Решение должно иметь минимальные изменения, поскольку все SP'S в настоящее время после этой тенденции.
Другие советы
Значения по умолчанию применяются только на вставках, если столбец не включен в список вставки. Я бы порекомендовал следующее не совсем тривиальное изменение (я прокомментировал строки, которые будут удалены):
ALTER Procedure dbo.APPL_ServerEnvironmentInsert
(
@ServerEnvironmentName varchar(50),
@ServerEnvironmentDescription varchar(1000),
@UserCreatedId uniqueidentifier,
@ServerEnvironmentId uniqueidentifier OUTPUT
)
WITH RECOMPILE
AS
---- Stores the ServerEnvironmentId.
--DECLARE @APPL_ServerEnvironment TABLE (ServerEnvironmentId uniqueidentifier)
IF @ServerEnvironmentName is null
SET @ServerEnvironmentName = newid()
-- Insert the data into the table.
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
--OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
---- If @ServerEnvironmentId was not supplied.
--IF (@ServerEnvironmentId IS NULL)
--BEGIN
-- -- Get the ServerEnvironmentId.
-- SELECT @ServerEnvironmentId = ServerEnvironmentId
-- FROM @APPL_ServerEnvironment
--END
Ограничение по умолчанию не будет использоваться этой процедурой, но вы можете оставить его на месте, если в таблицу могут быть добавлены другие места, где могут быть добавлены строки.
(Мой первый ответ был длинным и так это так, поэтому я размещаю второй ответ.)
Я пропустил, что вы используете NewsexentiD. Опять же, если в операторе вставки указан столбец, все значения по умолчанию, назначенные на этот столбец, не будут использоваться [Если вы не используете ключевое слово значение по умолчанию в операторе вставки, но это все еще все или ничего - вы не можете сказать «если @var нулевой, то по умолчанию». Отказ Я думаю, что вы застряли с простым ветвлением и полуаредедующим кодом, вдоль линий:
ALTER Procedure dbo.APPL_ServerEnvironmentInsert
(
@ServerEnvironmentName varchar(50),
@ServerEnvironmentDescription varchar(1000),
@UserCreatedId uniqueidentifier,
@ServerEnvironmentId uniqueidentifier OUTPUT
)
WITH RECOMPILE
AS
-- Stores the ServerEnvironmentId.
DECLARE @APPL_ServerEnvironment TABLE (ServerEnvironmentId uniqueidentifier)
IF @ServerEnvironmentId is null
BEGIN
-- ServerEnvironmentId not provided by user, generate during the insert
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
-- Get the new ServerEnvironmentId
SELECT @ServerEnvironmentId = ServerEnvironmentId
FROM @APPL_ServerEnvironment
END
ELSE
BEGIN
-- ServerEnvironmentId is provided by user
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId,
ServerEnvironmentId
)
OUTPUT Inserted.ServerEnvironmentId INTO @APPL_ServerEnvironment
VALUES
(
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId,
@ServerEnvironmentId
)
END
(Зачем заблокировать всю таблицу во время вставки?)