Vereinfachen SQL Insert die NEWSEQUNETIALID () Spalte verwendet standardmäßig
-
28-09-2019 - |
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?
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 demOUTPUT
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.