Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要一些SQL帮助将记录和相关记录复制到相同的表中吗_Sql_Sql Server - Fatal编程技术网

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

需要一些SQL帮助将记录和相关记录复制到相同的表中吗,sql,sql-server,Sql,Sql Server,我有3个相互关联的表中的记录。我试图复制记录,为用户提供填写表单的起点,而不是从头开始。我有一个可以正常工作的存储过程 最高级别的记录可以在中间层有许多相关的记录。我可以毫无问题地复制顶级记录并检索新记录的ID。我还可以复制中间级别的记录,并使用第一步中的新ID将其添加到表中。问题是,中级记录在第三级也有很多记录。我不知道如何将三级记录复制到它所属的每一个中级记录中。我从中间步骤获得新ID,但是它进入最后一条记录,所以所有第三级记录都被放在ID.的下面,我认为最后一步应该是中间步骤的子查询。这是

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

我创建了一个简单的测试环境,并使用答案复制了程序

代码:

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
select * 
from qad
  join qa on qad.qa_id = qa.id
  join qd on qa.qd_id = qd.id
where qd.id = 3
| 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 |
查询1

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
select * 
from qad
  join qa on qad.qa_id = qa.id
  join qd on qa.qd_id = qd.id
where qd.id = 3
| 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 |

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
select * 
from qad
  join qa on qad.qa_id = qa.id
  join qd on qa.qd_id = qd.id
where qd.id = 3
| 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 |

最初的关系是什么样子的?您是否有可能发布您的示例数据和预期输出?您应该查看INSERT的output子句,它可以为您提供中间表的新ID,可能是@VladimirBaranov的副本,我将您的答案用作模板。我在编辑器中没有发现错误,但当我尝试执行时,它会说insert语句中的列比第一个“块”的values子句中的列少。但是当我单独执行第一个“块”时,它工作得很好。你知道这是什么原因吗?我不知道如何将脚本放在这个评论窗口中,否则我会发布它。@RandyB.,你应该回答你的问题,并在问题中添加这些细节。显示所有表的定义(DDL)(使用SSM为您编写
创建表的脚本
)。向我们显示您试图运行的代码,并向我们显示您收到的确切错误消息。要在选择行中获取错误,请选择@NewQuoteID,[QA].[AssemblyName],[QA].[AssemblyQuantifier]多部分标识符“无法显示”bound@RandyB. 对不起,我没有测试我自己的答案。我重写了答案,并在我的测试环境中进行了测试