Упростите вставку SQL, которая по умолчанию использует столбец NEWSEQUNETIALID () - PullRequest
0 голосов
/ 08 октября 2010

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

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() over newid(). newsequentialid() нельзя задать в коде как newid(), его можно указывать в качестве значения по умолчанию только на уровне столбца таблицы.

Любые идеи по упрощению исходного запроса,но используя newsequentialid()?Или исходный запрос является наиболее упрощенным решением для достижения этой цели?

Ответы [ 3 ]

0 голосов
/ 08 октября 2010

Поскольку newsequentialid() можно использовать только в качестве значения по умолчанию для столбца, вы можете изменить исходный запрос на:

  • вставить только @ServerEnvironmentId, если значение не было указано, таким образом, генерируя новый последовательный идентификатор и извлекая его из предложения OUTPUT

  • , затем обновите эту строку, определенную либо @ServerEnvironmentId, переданным изначально, либо новым идентификатором, который вы только что создаливставив «фиктивную строку» в вашу таблицу

Не уверен, что это будет быстрее / эффективнее - вам придется провести некоторые измерения на этом.

0 голосов
/ 10 октября 2010

Моя первоначальная идея была правильной. Это самое простое и читаемое решение из возможных.

0 голосов
/ 08 октября 2010

Да. Попробуйте попробовать новый оператор слияния . Он должен быть на 100% совместим со столбцом по умолчанию для newsequentialid (), и он приведет SQL к единому краткому выражению. Надеюсь, это поможет.

...