2010-10-08 22 views
0

je la procédure stockée d'insertion suivante:Simplifier Insérer SQL qui utilise NEWSEQUNETIALID() par défaut de la colonne

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 

je aurais pu simplifié ci-dessus comme:

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 

Mais en le faisant, je perdre les améliorations de performances du newsequentialid() sur newid().newsequentialid() ne peuvent pas être définies dans le code newid(), elles peuvent uniquement être fournies en tant que valeur par défaut au niveau d'une colonne de table.

Des idées pour simplifier la requête originale, mais en utilisant newsequentialid()? Ou, la requête originale est-elle la solution la plus simplifiée pour y parvenir?

Répondre

0

Mon idée originale était correcte. C'est la solution la plus simple et la plus lisible possible.

0

Oui. Pensez à essayer le new merge statement. Il devrait être 100% compatible avec la valeur par défaut newsequentialid() de la colonne, et le SQL sera réduit à une seule instruction concise. J'espère que ça aide.

0

Depuis le newsequentialid() ne peut être utilisé comme une valeur par défaut de la colonne, vous pouvez changer votre requête originale:

  • insert juste la @ServerEnvironmentId si aucune valeur n'a été fournie, générant ainsi un nouvel ID séquentiel et le récupérer de la clause OUTPUT

  • puis mettre à jour cette ligne définie soit par le passé @ServerEnvironmentId à l'origine, ou le nouvel ID que vous venez de créer en insérant une « ligne factice » dans votre table

Je ne sais pas si ce serait plus rapide/plus efficace - vous devriez faire quelques mesures à ce sujet.