0

次の挿入ストアドプロシージャがあります。

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()ますか?または、元のクエリはこれを達成するための最も単純化されたソリューションですか?

4

3 に答える 3

0

私の最初の考えは正しかった。これは、可能な限り最も単純で最も読みやすいソリューションです。

于 2010-10-10T11:20:08.180 に答える
0

はい。新しいマージステートメントを試してみることを検討してください。これは、newsequentialid()の列のデフォルトと100%互換性があるはずであり、SQLを単一の簡潔なステートメントにまとめます。これがお役に立てば幸いです。

于 2010-10-08T05:46:14.053 に答える
0

newsequentialid()は列のデフォルト値としてのみ使用できるため、元のクエリを次のように変更できます。

  • 値が指定されていない場合にのみ挿入して、新しいシーケンシャルIDを生成し、句@ServerEnvironmentIdから取得しますOUTPUT

  • @ServerEnvironmentId次に、渡された元の行、または「ダミー行」をテーブルに挿入して作成したばかりの新しいIDのいずれかで定義された行を更新します。

それがより速く/より効率的であるかどうかはわかりません-あなたはそれについていくつかの測定をしなければならないでしょう。

于 2010-10-08T05:47:29.117 に答える