我有this tool(SSMS工具包)为特定表生成CRUD sp
但是我看看“插入”代码
/*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行 - 他/我可以使用output
关键字吗?如果是这样,output
会返回所有插入的记录吗? (如果在第11行插入记录> 1)
答案 0 :(得分:6)
有趣的问题!基于OUTPUT
条款here上的信息,我认为您可以更改此内容:
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;
都显示相同的结果。似乎工作!
答案 1 :(得分:1)
以下是使用OUTPUT
子句的示例
DECLARE @@ table_variable table(MasterEntityID,...)
INSERT INTO [dbo].[EServices_ME_Country_Info] ([MasterEntityID],...)
OUTPUT inserted.MasterEntityID,...
INTO @table_variable
SELECT @MasterEntityID, ...
而且,是的,您还可以获取默认插入的所有值或IDENTITY。