需要一些SQL帮助才能将记录和相关记录复制到相同的表中

时间:2017-06-23 00:53:25

标签: sql sql-server

我在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;

enter image description here

1 个答案:

答案 0 :(得分:0)

我使用答案here

创建了简单的测试环境和copy_qd程序

代码:

SQL Fiddle

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 |