从用户定义的表类型中获取新生成的ID,并将其插入包含更多数据的表中

时间:2017-06-25 17:47:36

标签: sql-server

提前抱歉我的天真标题

我的问题是 我有一个用户定义的表类型

CREATE TYPE [dbo].[CldDetails] AS TABLE
(
ScheduledDate         DATETIME,
Amount                MONEY,
pmtTypeId             INT,
StatusId              INT,
UpdatedDate           DATETIME
reference             Varchar(50)
)

我在存储过程中将该表作为输入参数

CREATE PROCEDURE [dbo].[AldAdd]
@clientDrafts                     [dbo].[CldDetails]  READONLY
AS
BEGIN
INSERT INTO [dbo].CPTDetail (cppId, Date, Amount, pmtTypeId, StatusId,    
UpdatedDate)
SELECT ScheduledDate, Amount, pmtTypeId, StatusId, UpdatedDate FROM  
@clientDrafts;
END

现在我的问题是我需要为上面插入中生成的每个ID插入一条新记录到另一个表中 @clientDrafts中的引用字段。假设@clientDrafts中有4条记录。记录号1有引用10007.然后生成第一个记录新的id 1 我需要从@clientDrafts获取新生成的id和引用10007到另一个表。

2 个答案:

答案 0 :(得分:2)

由于您未将reference值插入目标表,因此OUTPUT INSERT...SELECT子句中的cppId子句无法将其关联到生成的IDENTITY列{ {1}}值为reference的值。但是,您可以使用MERGE代替,假设您使用的是现代SQL Server版本。

ALTER PROCEDURE [dbo].[AldAdd]
    @clientDrafts [dbo].[CldDetails] READONLY
AS

MERGE [dbo].CPTDetail AS target
USING (SELECT
      ScheduledDate
    , Amount
    , pmtTypeId
    , StatusId
    , UpdatedDate
    , reference
    FROM @clientDrafts) AS source ON 0 = 1 --unconditional inserts
WHEN NOT MATCHED THEN 
    INSERT (
        Date
        , Amount
        , pmtTypeId
        , StatusId
        , UpdatedDate
        )
    VALUES (
        source.ScheduledDate
        , source.Amount
        , source.pmtTypeId
        , source.StatusId
        , source.UpdatedDate
    )
OUTPUT
        inserted.cppId --generated identity value
      , source.ScheduledDate
      , source.Amount
      , source.pmtTypeId
      , source.StatusId
      , source.UpdatedDate
      , source.reference
      INTO dbo.AnotherTable;
GO

答案 1 :(得分:0)

请尝试这个: 将@@ IDENTITY用于新创建的记录,这将为您提供上次插入记录的ID我将为您提供示例SQL脚本,请尝试根据您的表格进行修改。
还有一个你需要逐个使用光标提取记录。

DECLARE @Id decimal(18,0)
    DECLARE @newId decimal(18,0)
DECLARE Cur CURSOR FOR SELECT pId FROM  temp

OPEN Cur 
FETCH NEXT FROM Cur INTO @Id

WHILE ( @@FETCH_STATUS = 0 )

BEGIN

 --------------Insert into table 1
                INSERT INTO temp (pId,Name)
                SELECT pId ,Name from @clientDrafts where pId = @Id 

SET @newId = @@IDENTITY

 --------------Insert into table 1
                INSERT INTO temp2
                (Id,Name,pId)
                Select Id,Name,pId=@newId from temp2 
                    where 
                        pId = @Id

FETCH NEXT FROM Cur INTO @Id

END

CLOSE Cur 
DEALLOCATE Cur

请试试这会对你有帮助。