批量插入父子表

时间:2014-10-24 06:04:08

标签: sql sql-server stored-procedures

我有以下三个表(每个RobotPart只有一个手臂和一个腿)。我需要插入大量的{arm,leg}对。任何新的手臂和腿组合都会在RobotPart中创建一个新条目。不会插入任何现有组合。父母或子女都不需要更新。我需要保留标识列。在SQL中实现这一点的任何有效方法?

CREATE TABLE [dbo].[Arm](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Model] [varchar](20) NULL,
 CONSTRAINT [PK_dbo.Arm] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)
) ON [PRIMARY]

CREATE TABLE [dbo].[Leg](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Model] [varchar](10) NULL,
 CONSTRAINT [PK_dbo.Leg] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)
) ON [PRIMARY]


CREATE TABLE [dbo].[RobotPart](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](20) NOT NULL,
    [ArmId] [int] NOT NULL,
    [LegId] [int] NOT NULL,
 CONSTRAINT [PK_dbo.RobotPart] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)
) ON [PRIMARY]
GO


ALTER TABLE [dbo].[RobotPart]  WITH CHECK ADD  CONSTRAINT [FK_dbo.RobotPart_dbo.Arm_ArmId] FOREIGN KEY([ArmId])
REFERENCES [dbo].[Arm] ([Id])
GO

ALTER TABLE [dbo].[RobotPart] WITH CHECK ADD  CONSTRAINT [FK_dbo.RobotPart_dbo.Leg_LegId] FOREIGN KEY([LegId])
REFERENCES [dbo].[Leg] ([Id])
GO

2 个答案:

答案 0 :(得分:1)

步骤1:分别使用源表中的LEFT OUTER JOIN插入新的手臂和腿部到手臂和腿部桌子。 (每个表的单独插入语句) 第2步:使用源表中的内部连接到臂和腿以及从源表到RobotPart表的左外部连接插入新组合。

答案 1 :(得分:0)

这是我最初尝试使用MERGE。不确定这与Lmu92提出的比较。

CREATE TYPE [dbo].[RobotPart_udtt] AS TABLE(
    [Arm] [varchar](20) NOT NULL,
    [Leg] [varchar](10) NOT NULL,
    [Name] [varchar](20) NOT NULL
)
GO

CREATE PROCEDURE dbo.[prc_Component_Create]
    @robotParts [RobotPart_udtt] READONLY
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @messageId INT
    DECLARE @status INT

    MERGE [Arm] AS TARGET
    USING (
            SELECT 
                tR.arm AS Model
            FROM @robotParts AS tR
    ) AS SOURCE
    ON TARGET.Model = SOURCE.Model
    WHEN NOT MATCHED THEN
        INSERT 
        (
            Model
        ) 
        VALUES 
        (
            SOURCE.Model
        );

    MERGE [Leg] AS TARGET
    USING (
            SELECT 
                tR.leg AS Model
            FROM @robotParts AS tR
    ) AS SOURCE
    ON TARGET.Model = SOURCE.Model
    WHEN NOT MATCHED THEN
        INSERT 
        (
            Model
        ) 
        VALUES 
        (
            SOURCE.Model
        );

    WITH NewParts (ArmId, LegId, Name)
    AS 
    (
        SELECT tA.Id
            , tL.Id
            , tR.Name
        FROM @robotParts AS tR
            INNER JOIN [Arm] AS tA
                ON tR.Arm = tA.Model
            INNER JOIN [Leg] AS tL
                ON tR.Leg = tL.Model
    )
    INSERT INTO RobotPart (Name, ArmId, LegId) 
    SELECT tN.Name
        , tN.ArmId
        , tN.LegId
    FROM NewParts AS tN
        LEFT JOIN RobotPart AS tR
            ON tR.ArmId = tN.ArmId
            AND tR.LegId = tN.LegId
        WHERE tR.ArmId IS NULL AND tR.LegId IS NULL
END
相关问题