【问题标题】:Stored procedure to duplicate master detail data复制主从数据的存储过程
【发布时间】:2012-04-03 23:48:39
【问题描述】:

我是新的存储过程,并试图编写一个过程来将用户(通过 user_id)主详细数据复制到新的用户数据中。这是我的表结构。我会将目标 user_id 和目标 user_id 传递给存储过程。你能告诉我如何实现这个功能吗?感谢您的帮助。

TABLE A
----------------
a_id       int(Primary Key)  
desc       varchar(50)
user_id    int

TABLE B
-----------------
b_id       int(Primary Key)
a_id       int(Foreign Key)
detail     varchar(100)

CREATE PROCEDURE [duplicate_user_data] 
    @old_user_id int,
    @new_user_id int
AS
BEGIN
    INSERT INTO TABLEA
           ([desc]
           ,[user_id]
           )
    select desc, user_id from TABLEA where user_id = @old_user_id
END

【问题讨论】:

  • 插入后,将 scope_identity() 捕获到局部变量中,然后使用 a_id 列中的局部变量插入 tableB 的选择。
  • 如何从 TABLEA 获取多条记录的 scope_identity()?
  • 如果你有多个,那么使用OUTPUT INTO

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以使用自联接来匹配新旧父 ID。

CREATE PROCEDURE [duplicate_user_data] 
    @old_user_id int,
    @new_user_id int
AS
    INSERT INTO TableA ([desc], [user_id])
    SELECT [desc], @new_user_id
    FROM TableA
    WHERE [user_id] = @old_user_id

    INSERT INTO TableB ([a_id], [detail])
    SELECT NewTableA.[a_id], TableB.[detail]
    FROM TableA AS NewTableA
    CROSS JOIN TableA AS OldTableA
    JOIN TableB ON TableB.[a_id] = OldTableA.[a_id]
    WHERE NewTableA.[user_id] = @new_user_id
    AND OldTableA.[user_id] = @old_user_id

【讨论】:

  • 我的 TABLE B 表中有 13 条记录。但我使用 CROSS JOIN 查询得到 37752 行。
  • 哇,这出乎意料。您的 WHERE 子句是否真的包含两个 user_id 变量?另外,我的回答假设 TableA 的 [user_id] 上有一个 UNIQUE 约束。对吗?
  • 是的,user_id 是唯一的。现在我使用了两个 user_id 变量,但这次它返回 66 条记录。
【解决方案2】:

如果我对您的理解正确,您想为新用户插入一条新记录,但从另一个用户那里复制详细信息。如果是这样,那么你可以这样做:

CREATE PROCEDURE [duplicate_user_data] 
    @old_user_id int,
    @new_user_id int
AS
BEGIN
    declare @old_a_id int

    -- get the old a_id first
    SELECT @old_a_id = a_id
    FROM TableA
    WHERE [user_id] = @old_user_id

    -- insert the new record into TableA
    INSERT INTO TABLEA
    (
        [desc]
        ,[user_id]
    )
    select [desc]
        , @new_user_id 
    from TABLEA 
    where [user_id] = @old_user_id

    -- insert new record into tableB using the @old_a_id 
    INSERT INTO TableB
    (
        a_id
        , detail
    )
    SELECT @old_a_id
        , detail
    FROM TableB
    WHERE a_id = @old_a_id
END

然后,这会将您的 new_user_id 插入到 TableA 中,但会从您的 old_user_id 中获得 [desc]

【讨论】:

  • 谢谢。如何复制 TABLE B 数据?
  • 你想用 TableB 做什么?您的 OP 不清楚。
  • 我必须从 TABLEA 获取旧的 a_id 并查询 TABLEB 并复制。
  • 我是否必须遍历表 A 中的记录并插入到表 A 和表 B 中?
  • 根据您的问题,您一次插入一个新 id,因此不需要循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多