Упростите вставку SQL, которая использует столбец NewsNetialid () по умолчанию
-
28-09-2019 - |
Вопрос
У меня есть следующая вставка хранимой процедуры:
CREATE 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 was not supplied.
IF (@ServerEnvironmentId IS NULL)
BEGIN
-- 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
)
-- Get the ServerEnvironmentId.
SELECT @ServerEnvironmentId = ServerEnvironmentId
FROM @APPL_ServerEnvironment
END
ELSE
BEGIN
-- Insert the data into the table.
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentId,
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
VALUES
(
@ServerEnvironmentId,
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
END
GO
Я мог бы упростить вышесказанное как:
CREATE Procedure dbo.APPL_ServerEnvironmentInsert
(
@ServerEnvironmentName varchar(50),
@ServerEnvironmentDescription varchar(1000),
@UserCreatedId uniqueidentifier,
@ServerEnvironmentId uniqueidentifier OUTPUT
)
WITH RECOMPILE
AS
-- Ensure @ServerEnvironmentId IS NOT NULL
SELECT ISNULL(@ServerEnvironmentId, newid())
-- Insert the data into the table.
INSERT INTO APPL_ServerEnvironment WITH(TABLOCKX)
(
ServerEnvironmentId,
ServerEnvironmentName,
ServerEnvironmentDescription,
DateCreated,
UserCreatedId
)
VALUES
(
@ServerEnvironmentId,
@ServerEnvironmentName,
@ServerEnvironmentDescription,
GETDATE(),
@UserCreatedId
)
GO
Но, делая это, я теряю улучшения производительности newsequentialid()
над newid().
newsequentialid()
не может быть установлен в коде как newid()
, он может быть поставляется только в виде значения по умолчанию на уровне столбца таблицы.
Любые идеи кто-либо на упрощении оригинального запроса, но с использованием newsequentialid()
? Или оригинальный запрос самым упрощенным решением в достижении этого?
Решение 3
Моя оригинальная идея была правильной. Это самое простое и наиболее читаемое решение.
Другие советы
Поскольку newsequentialid()
Может использоваться только в качестве значения по умолчанию столбца, вы можете изменить исходный запрос:
Вставить только то
@ServerEnvironmentId
Если значение не было поставлено, что создает новый последовательный идентификатор и извлекивая его изOUTPUT
пунктЗатем обновите эту строку, определяемую либо
@ServerEnvironmentId
пропущено изначально, или новый идентификатор, который вы только что создали, вставив «фиктивную строку» в свой стол
Не уверен, что это будет каким бы быстрее / более эффективным - вам придется делать некоторые измерения на этом.
Да. Подумайте о том, чтобы дать Новое заявление слияния попробовать. Это должно быть на 100% совместимо с столбцом по умолчанию NewsexentialID (), и он получит SQL в одно краткое описание. Надеюсь, это поможет.