提前抱歉我的天真标题
我的问题是 我有一个用户定义的表类型
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到另一个表。
答案 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
请试试这会对你有帮助。