【发布时间】:2013-08-29 07:04:22
【问题描述】:
我正在尝试在父/子关系中插入一些行。如何在 SQL 中实现这一点?
这将是我用来查找要插入的信息的基本查询:
SELECT * FROM parentTable p
INNER JOIN childTable c
ON p.ID = c.ParentTableID
WHERE p.PlanID = 123456
需要发生的是我首先插入 ParentTable 行,这实际上只是匹配行的副本,但具有新的 PlanID 和 Created Date。然后我从插入的行中取出父表 ID,并将其用于相同的进程,但用于子表。
所以我需要在 .Net 中至少循环遍历所有 parentTable 匹配项并为每个匹配项创建 1 个 childTable 行。
我试图使用MERGE 和OUTPUT 子句,但似乎我可能正在使用方钉作为圆孔。使用某种类型的 CURSOR 会更好吗?
所以这就是我根据下面的答案到目前为止所得到的。不幸的是,它没有抓住SCOPE_IDENTITY()...有什么诀窍吗?因为那是返回 NULL,所以我在插入时遇到 FK 错误。
USE MemberCenteredPlan
DECLARE @NewPlanID BIGINT;--49727690
DECLARE @OldPlanID BIGINT;--49725211
DECLARE @NewSWReAssID BIGINT;
SET @NewPlanID = 49727690
SET @OldPlanID = 49725211
BEGIN
INSERT INTO tblSocialWorkerReAssessment
SELECT
@NewPlanID
,[Discussed]
,Discussion
,NULL
,NULL
,NULL
,CreatedBy
,GETDATE()
,NULL
,NULL
FROM tblSocialWorkerReAssessment
WHERE PlanID = @OldPlanID
SELECT @NewSWReAssID = SCOPE_IDENTITY();
INSERT INTO tblPlanDomain
SELECT
@NewPlanID
,[DomainTypeID]
,[MemberOutcomes]
,[MemberPreferences]
,[DomainDate]
,[Steps]
,[ClinicalFunctionalConcerns]
,[ReportWageES]
,[ReportWageSSA]
,@NewSWReAssID
,[CreatedBy]
,GETDATE()
,NULL
,NULL
,NEWID()
FROM tblPlanDomain
WHERE planID = @OldPlanID
END
【问题讨论】:
标签: sql sql-server merge sql-server-2008-r2