Упростите вставку SQL, которая использует столбец NewsNetialid () по умолчанию

StackOverflow https://stackoverflow.com/questions/3887970

Вопрос

У меня есть следующая вставка хранимой процедуры:

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 в одно краткое описание. Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top