سؤال

لدي الإجراء التالي المخزن:

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 إلى بيان موجز واحد. آمل أن يساعد هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top