تبسيط SQL Insert الذي يستخدم عمود NewSequeNetialId () الافتراضي
-
28-09-2019 - |
سؤال
لدي الإجراء التالي المخزن:
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()
؟ أم أن الاستعلام الأصلي هو الحل الأكثر بساطة في تحقيق هذا؟
المحلول 3
كانت فكرتي الأصلية صحيحة. هذا هو الحل الأبسط والأكثر قابلية للقراءة.
نصائح أخرى
منذ newsequentialid()
لا يمكن استخدامها إلا كقيمة افتراضية للعمود ، يمكنك تغيير استعلامك الأصلي إلى:
أدخل فقط
@ServerEnvironmentId
إذا لم يتم توفير أي قيمة ، مما يولد معرفًا متسلسلًا جديدًا واسترداده منOUTPUT
بندثم قم بتحديث هذا الصف المحدد بواسطة إما
@ServerEnvironmentId
تم تمريره في الأصل ، أو المعرف الجديد الذي قمت بإنشائه للتو عن طريق إدخال "صف وهمي" في طاولتك
لست متأكدًا مما إذا كان ذلك سيكون أسرع / أكثر كفاءة - فسيتعين عليك القيام ببعض القياسات على ذلك.
نعم. النظر في إعطاء بيان دمج جديد محاولة. يجب أن يكون متوافقًا بنسبة 100 ٪ مع الافتراضي للعمود لـ NewSequentialId () ، وسيقوم بإسقاط SQL إلى بيان موجز واحد. آمل أن يساعد هذا.