2

特定のテーブルの CRUD spを生成するこのツール(SSMS Tools Pack) があります。

しかし、「挿入」コードを見てください

/*1*/   CREATE PROC [dbo].[usp_EServices_ME_Country_InfoInsert] 
/*2*/       @MasterEntityID int,
/*3*/       ...
/*4*/   AS 
/*5*/       SET NOCOUNT ON 
/*6*/       SET XACT_ABORT ON  
/*7*/       
/*8*/       BEGIN TRAN
/*9*/       
/*10*/      INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...)
/*11*/      SELECT @MasterEntityID, ...
/*12*/      
/*13*/      -- Begin Return Select <- do not remove
/*14*/      SELECT [ID], [MasterEntityID],...
/*15*/      FROM   [dbo].[EServices_ME_Country_Info]
/*16*/      WHERE  [ID] = SCOPE_IDENTITY()
/*17*/      -- End Return Select <- do not remove
/*18*/                  
/*19*/      COMMIT
/*20*/   GO

私の質問は 14 行目についてです - They/I はoutputキーワードを使用できますか? もしそうなら、挿入されたすべてのレコードoutputを返すでしょうか? (行番号 11 に挿入されたレコードが 1 つ以上ある場合)

4

2 に答える 2

6

興味深い質問です。ここOUTPUTの条項に関する情報に基づいて、これを変更できると思います。

INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...)
SELECT @MasterEntityID, ...

-- Begin Return Select <- do not remove
SELECT [ID], [MasterEntityID],...
FROM   [dbo].[EServices_ME_Country_Info]
WHERE  [ID] = SCOPE_IDENTITY()
-- End Return Select <- do not remove

これに:

INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...)
OUTPUT INSERTED.MasterEntityID, ...
SELECT @MasterEntityID, ...

同じ結果で。これは今のところ単なる理論です。これをテストしてフォローアップします。

ファローアップ:

私のOUTPUT句は正しくありませんでした。句OUTPUTの直後に使用する必要がありますINSERT。上記のクエリでそれを編集しました。これをテストするために次のコードを使用しました。

-- Create a test table
CREATE TABLE TestTable (
    ID INT IDENTITY
    ,TestV1 INT
    ,TestV2 INT
    ,TestV3 INT
);
GO

-- Example sp with the 'old' method using SCOPE_IDENTITY()
CREATE PROCEDURE usp_InsertFirstMethod
(
    @v1 INT
    ,@v2 INT
    ,@v3 INT
)
AS

SET NOCOUNT ON 
SET XACT_ABORT ON  

BEGIN TRAN

INSERT INTO dbo.TestTable (TestV1, TestV2, TestV3)
SELECT @v1, @v2, @v3;

-- Begin Return Select <- do not remove
SELECT ID, TestV1, TestV2, TestV3
FROM   dbo.TestTable
WHERE  ID = SCOPE_IDENTITY()
-- End Return Select <- do not remove

COMMIT TRAN;
GO

-- Example sp to show use of OUTPUT clause
CREATE PROCEDURE usp_InsertSecondMethod
(
    @v1 INT
    ,@v2 INT
    ,@v3 INT
)
AS

SET NOCOUNT ON 
SET XACT_ABORT ON  

BEGIN TRAN

INSERT INTO dbo.TestTable (TestV1, TestV2, TestV3)
OUTPUT INSERTED.*
SELECT @v1, @v2, @v3;

COMMIT TRAN;
GO

と の両方EXECUTE dbo.usp_InsertFirstMethod 1, 2, 3;EXECUTE dbo.usp_InsertSecondMethod 1, 2, 3;同じ結果が表示されます。うまくいくようです!

于 2013-07-18T07:35:08.457 に答える
1

OUTPUTDECLARE @@table_variable table(MasterEntityID,...) 句の使用例を次に示します。

INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...)
OUTPUT inserted.MasterEntityID,...
INTO  @table_variable
SELECT @MasterEntityID, ...

そして、はい、デフォルトで、または IDENTITY として挿入されるすべての値を取得することもできます。

于 2013-07-18T07:54:37.773 に答える