需要一些SQL帮助将记录和相关记录复制到相同的表中吗
我有3个相互关联的表中的记录。我试图复制记录,为用户提供填写表单的起点,而不是从头开始。我有一个可以正常工作的存储过程 <>最高级别的记录可以在中间层有许多相关的记录。我可以毫无问题地复制顶级记录并检索新记录的ID。我还可以复制中间级别的记录,并使用第一步中的新ID将其添加到表中。问题是,中级记录在第三级也有很多记录。我不知道如何将三级记录复制到它所属的每一个中级记录中。我从中间步骤获得新ID,但是它进入最后一条记录,所以所有第三级记录都被放在ID.的下面,我认为最后一步应该是中间步骤的子查询。这是我到目前为止所拥有的,并感谢任何能提供帮助的人需要一些SQL帮助将记录和相关记录复制到相同的表中吗,sql,sql-server,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;
我创建了一个简单的测试环境,并使用答案复制了程序 代码: 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. 对不起,我没有测试我自己的答案。我重写了答案,并在我的测试环境中进行了测试