我在3个表中有相互关联的记录。我正在尝试复制记录,以便为用户提供填写表单的起点,而不是从头开始。我有一个有点工作的存储过程。
顶级记录可以在中间级别有许多相关记录。我可以复制顶级记录没问题,并检索新记录的ID。我还可以复制中级记录,并使用第一步中的新ID将其添加到表中。问题是中级记录在第三级也有很多记录。我不知道如何将第三级记录复制到它所属的每个中级记录中。我从中间步骤获取新ID,但它转到插入的最后一条记录,因此所有第三级记录都被置于该ID之下。我认为最后一步应该是中间步骤的子查询?这是我到目前为止所感谢的任何可以提供帮助的人。
ALTER PROCEDURE [dbo].[qryCopyQuote]
-- Add the parameters for the stored procedure here
@OriginalQuoteID INT,
@NewQuoteNumber VARCHAR(10),
@NewQuoteID INT OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
INSERT INTO [tbl_QuoteDetails](
[QuoteNumber], [Revision], [CurrentDate],
[QuoteDate], [Country], [StateID], [City],
[ProjectName], [RepCompanyID], [ApplicationEngineer],
[ElectricalEngineer], [MechanicalEngineer], [RevisionNotes]
)
SELECT @NewQuoteNumber, '-', [CurrentDate],
[QuoteDate], [Country], [StateID], [City],
[ProjectName], [RepCompanyID], [ApplicationEngineer],
[ElectricalEngineer], [MechanicalEngineer], [RevisionNotes]
FROM [tbl_QuoteDetails] AS QD
WHERE [QD].QuoteID = @OriginalQuoteID
SET @NewQuoteID = SCOPE_IDENTITY();
INSERT INTO [tbl_QuoteAssemblies](
[QuoteID], [AssemblyName], [AssemblyQuantity]
)
SELECT @NewQuoteID, [QA].[AssemblyName], [QA].[AssemblyQuantity]
FROM [tbl_QuoteAssemblies] AS QA
WHERE [QA].[QuoteID] = @OriginalQuoteID
DECLARE @NewAssemblyID int
SET @NewAssemblyID = SCOPE_IDENTITY();
INSERT INTO [tbl_QuoteAssemblyDetails](
[AssemblyID], [ItemQuantity], [PartNumber],
[ItemCost], [ItemDescription], [LastUpdate],
[VendorContractPrice], [VendorItem]
)
SELECT @NewAssemblyID, [QD].[ItemQuantity], [QD].[PartNumber],
[QD].[ItemCost], [QD].[ItemDescription], [QD].[LastUpdate],
[QD].[VendorContractPrice], [QD].[VendorItem]
FROM [tbl_QuoteAssemblyDetails] AS QD
INNER JOIN [tbl_QuoteAssemblies] QA ON [QD].[AssemblyID] = [QA].[AssemblyID]
WHERE [QA].[QuoteID] = @OriginalQuoteID
RETURN @NewQuoteID;
答案 0 :(得分:0)
我使用答案here
创建了简单的测试环境和copy_qd
程序
代码:
MS SQL Server 2014架构设置:
create table qd (
id int not null identity(1,1) primary key,
data nvarchar(max) not null
)
create table qa (
id int not null identity(1,1) primary key,
qd_id int not null,
data nvarchar(max) not null
)
create table qad (
id int not null identity(1,1) primary key,
qa_id int not null,
data nvarchar(max) not null
)
GO
create procedure copy_qd
@old_qd_id int
as
begin
declare
@new_qd_id int
insert qd(data) select data from qd where id = @old_qd_id
set @new_qd_id = scope_identity()
declare @a_ids table (old_id int, new_id int)
merge qa
using (select id, data from qa where qd_id = @old_qd_id) as old
on (1=0) --arbitrary join condition
when not matched then
insert (qd_id, data)
values (@new_qd_id, old.data)
output old.id, inserted.id
into @a_ids
;
insert qad(qa_id, data)
select map.new_id, old.data
from qad old join @a_ids map on old.qa_id = map.old_id
return @new_qd_id
end
go
set identity_insert qd on
insert qd (id, data) values (1, 'qd_1')
insert qd (id, data) values (2, 'qd_2')
set identity_insert qd off
set identity_insert qa on
insert qa (id, qd_id, data) values (1, 1, 'qd_1.qa_1')
insert qa (id, qd_id, data) values (2, 1, 'qd_1.qa_2')
insert qa (id, qd_id, data) values (3, 1, 'qd_1.qa_3')
insert qa (id, qd_id, data) values (4, 2, 'qd_2.qa_1')
insert qa (id, qd_id, data) values (5, 2, 'qd_2.qa_2')
insert qa (id, qd_id, data) values (6, 2, 'qd_2.qa_3')
set identity_insert qa off
set identity_insert qad on
insert qad (id, qa_id, data) values (1, 1, 'qd_1.qa_1.qad_1')
insert qad (id, qa_id, data) values (2, 1, 'qd_1.qa_1.qad_2')
insert qad (id, qa_id, data) values (3, 1, 'qd_1.qa_1.qad_3')
insert qad (id, qa_id, data) values (4, 2, 'qd_1.qa_2.qad_1')
insert qad (id, qa_id, data) values (5, 2, 'qd_1.qa_2.qad_2')
insert qad (id, qa_id, data) values (6, 2, 'qd_1.qa_2.qad_3')
insert qad (id, qa_id, data) values (7, 3, 'qd_1.qa_3.qad_1')
insert qad (id, qa_id, data) values (8, 3, 'qd_1.qa_3.qad_2')
insert qad (id, qa_id, data) values (9, 3, 'qd_1.qa_3.qad_3')
insert qad (id, qa_id, data) values (10, 4, 'qd_2.qa_1.qad_1')
insert qad (id, qa_id, data) values (11, 4, 'qd_2.qa_1.qad_2')
insert qad (id, qa_id, data) values (12, 4, 'qd_2.qa_1.qad_3')
insert qad (id, qa_id, data) values (13, 5, 'qd_2.qa_2.qad_1')
insert qad (id, qa_id, data) values (14, 5, 'qd_2.qa_2.qad_2')
insert qad (id, qa_id, data) values (15, 5, 'qd_2.qa_2.qad_3')
insert qad (id, qa_id, data) values (16, 6, 'qd_2.qa_3.qad_1')
insert qad (id, qa_id, data) values (17, 6, 'qd_2.qa_3.qad_2')
insert qad (id, qa_id, data) values (18, 6, 'qd_2.qa_3.qad_3')
set identity_insert qad off
--copying data
exec copy_qd 1
查询1 :
select *
from qad
join qa on qad.qa_id = qa.id
join qd on qa.qd_id = qd.id
where qd.id = 3
<强> Results 强>:
| id | qa_id | data | id | qd_id | data | id | data |
|----|-------|-----------------|----|-------|-----------|----|------|
| 19 | 7 | qd_1.qa_1.qad_1 | 7 | 3 | qd_1.qa_1 | 3 | qd_1 |
| 20 | 7 | qd_1.qa_1.qad_2 | 7 | 3 | qd_1.qa_1 | 3 | qd_1 |
| 21 | 7 | qd_1.qa_1.qad_3 | 7 | 3 | qd_1.qa_1 | 3 | qd_1 |
| 22 | 8 | qd_1.qa_2.qad_1 | 8 | 3 | qd_1.qa_2 | 3 | qd_1 |
| 23 | 8 | qd_1.qa_2.qad_2 | 8 | 3 | qd_1.qa_2 | 3 | qd_1 |
| 24 | 8 | qd_1.qa_2.qad_3 | 8 | 3 | qd_1.qa_2 | 3 | qd_1 |
| 25 | 9 | qd_1.qa_3.qad_1 | 9 | 3 | qd_1.qa_3 | 3 | qd_1 |
| 26 | 9 | qd_1.qa_3.qad_2 | 9 | 3 | qd_1.qa_3 | 3 | qd_1 |
| 27 | 9 | qd_1.qa_3.qad_3 | 9 | 3 | qd_1.qa_3 | 3 | qd_1 |