Frage

Ich habe folgendes Insert Stored Procedure:

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

Ich hätte das oben als vereinfachte

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

Aber so zu tun, ich verliere die Leistungsverbesserungen der newsequentialid() über newid(). newsequentialid() kann nicht im Code als newid() eingestellt wird, kann es nur als Standardwert auf einer Tabellenspalte Ebene geliefert werden.

All jemand Ideen auf die ursprüngliche Abfrage zu vereinfachen, aber unter Verwendung von newsequentialid()? Oder ist die ursprüngliche Abfrage der vereinfachte Lösung in diesem Ziel zu erreichen?

War es hilfreich?

Lösung 3

Meine ursprüngliche Idee war richtig. Es ist die einfachste und lesbare Lösung möglich.

Andere Tipps

Da die newsequentialid() kann nur als Spaltenstandardwert verwendet, könnten Sie Ihre ursprüngliche Abfrage ändern:

  • legen Sie einfach die @ServerEnvironmentId wenn kein Wert angegeben worden war, so dass eine neue sequenzielle ID zu erzeugen und aus dem OUTPUT Klausel abrufen

  • dann diese Zeile entweder durch die in ursprünglich bestanden @ServerEnvironmentId definiert aktualisieren oder die neue ID Sie gerade erstellt haben, indem Sie eine „Dummy-Reihe“ in Ihre Tabelle einfügen

Nicht sicher, ob das wäre schneller / effizienter -. Sie würden einige Messungen zu tun haben, auf dem

Ja. Betrachten Sie die neue Merge-Anweisung einen Versuch. Es soll zu 100% kompatibel mit der Spalte Standard von NEWSEQUENTIALID () sein, und es wird die SQL auf eine einzige prägnante Aussage. Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top