2010-10-08 6 views
0

У меня есть следующие вставки хранимой процедуры:Упростить SQL Insert, которая использует столбец NEWSEQUNETIALID() по умолчанию

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()? Или, является ли первоначальный запрос наиболее упрощенным решением для достижения этого?

ответ

0

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

0

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

0

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

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

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

  • 012 новый идентификатор

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