Как получить Scope Identity Column при вставке данных с использованием хранимой процедуры - PullRequest
0 голосов
/ 11 октября 2018

Я вставляю datatable с использованием хранимой процедуры и создал таблицу типов прежде, запрос - я хочу вернуть все ProdID, который был вставлен в этот сеанс.для одной вставки я могу получить идентификатор области, но я хочу получить все для последней вставки.

Заранее спасибо.

[dbo].[sp_Isert] (@dt_Product Product_Table READONLY, @ProdID int out)  
AS
INSERT into tblProduct (Name,Batch,Qty,ExpDate)
SELECT Name, Batch, Qty, ExpDate
FROM  @dt_Product;

set @ProdID = Scope_Identity( )

select Scope_Identity( ) ProdID

1 Ответ

0 голосов
/ 11 октября 2018

Не используйте scope_identity() - используйте вместо него предложение output.Обратите внимание, что SQL Server не поддерживает табличные параметры в качестве параметров out, то есть единственный способ вернуть набор записей из хранимой процедуры - это либо использовать предложение output (не в таблицу), либо выполнить оператор select.

Кроме того, не используйте префикс sp для хранимой процедурыd.
Microsoft использует этот префикс для системных процедур, поэтому вы можете получить конфликт имен.

ALTER PROCEDURE [dbo].[stp_Isert] (@dt_Product Product_Table READONLY)  
AS

INSERT into tblProduct (Name,Batch,Qty,ExpDate)
OUTPUT Inserted.Id -- This will return a recordset with the inserted ids to the calling application.
SELECT Name, Batch, Qty, ExpDate
FROM  @dt_Product;

Обновление

Я сделал пример сценария для проверки.Когда я запускаю это на своем экземпляре SQL Server, я получаю ожидаемые результаты:

CREATE TABLE tbl_TestOutputClause (Id int identity(1,1), Col int );
GO
CREATE TYPE udt_TestOutputClauseIntegers AS TABLE (Value int);
GO

CREATE PROCEDURE stp_TestOutputClauseInsert (@Values dbo.udt_TestOutputClauseIntegers READONLY)
AS
    INSERT INTO tbl_TestOutputClause(Col)
    OUTPUT INSERTED.Id
    SELECT Value
    FROM @Values;

GO

CREATE PROCEDURE stp_TestOutputClauseGetInsertedValues 
AS
    DECLARE @Ids AS TABLE (Id int);
    DECLARE @Vals dbo.udt_TestOutputClauseIntegers;
    INSERT INTO @Vals (Value) VALUES (1), (2), (3);

    INSERT INTO @Ids
    EXEC stp_TestOutputClauseInsert @Vals;

    -- should return three rows with the values 1, 2 and 3.    
    SELECT *
    FROM @Ids;

GO

EXEC stp_TestOutputClauseGetInsertedValues;

-- clean up
DROP TABLE tbl_TestOutputClause;
DROP PROCEDURE stp_TestOutputClauseInsert;
DROP PROCEDURE stp_TestOutputClauseGetInsertedValues 
DROP TYPE udt_TestOutputClauseIntegers;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...