2011-08-06 102 views
0

因此,假设我们有一个表t1,我们需要将每个插入的行复制到t2中,并在它们之间放置外键链接。让我告诉我的意思:有没有办法在视图中获取插入的缩进?

我们有表T1

----------------------------- 
| id | value | external_id| 
----------------------------- 
| |   |   | 
----------------------------- 

和表T2

---------------- 
| id | value | 
---------------- 
| |   | 
---------------- 

其中id列具有IDENTITY标记和EXTERNAL_ID是一个链接到t2.id(I”将在下面解释)

我们打算将行(value ='TEST')插入到表t1中。预期的结果是这样的:

----------------------------- 
| id | value | external_id| 
----------------------------- 
| 123| TEST | 345  | 
----------------------------- 

和表T2

---------------- 
| id | value | 
---------------- 
| 345| TEST | 
---------------- 

algorythm的主要思想是基于触发器:在INSTEAD OF触发对表1我做的:

  1. 插入到t1并记住插入的ID在一个单独的表中使用OUTPUT子句
  2. 插入到t2并记住马使用映射

OUTPUT

  • 更新external_id柱再次pping (t1.id, t2.id)但是,有一些我不明白怎么打的一些问题:

    1. T1实际上不是一个表,它是一个视图与INSTEAD OF触发器(但这不是一个问题)
    2. t2也是一个触发视图,这是一个问题,因为我不能从它插入的ID
    3. 此外t2是一个远程视图 - 这是一个大问题,因为在使用远程视图时存在一些限制

    所以,也许我正朝着一个错误的方向前进?有没有办法解决我的问题,而不使用光标和存储过程在t1上的触发器? (我的意思是我知道有一种方法可以通过存储过程将所有数据存入t2,并在该过程的OUTPUT参数中获取插入的id,但也许有更优雅的方式?)

  • 回答

    0

    对我来说似乎是,如果t1需要从t2开始,而不是反过来,你应该使t1的INSTEAD触发器先插入t2,然后t1。您可以将插入的OUTPUT子句用于t2。

    +0

    不幸的是我不能在远程表或视图上使用OUTPUT子句。所以可能存储过程是唯一的选择。 – Dima

    +0

    因此,您正在创建sp以在t2坐的服务器上执行t2插入,对吗?所以你仍然会先执行t2插入,然后使用返回的id来执行t1插入。 – Bill

    +0

    不,目前的解决方案是这样的:1.插入t1。 2.将数据打包到xml中,并将其插入带有sp的t2中。 3.更新t1 – Dima

    0

    使用来自第一次插入的存储过程@@ Identity

    +0

    感谢您的建议,但@@身份不会解决问题的情况下,当多个值插入到table1中时。 – Dima

    +0

    你是说第1步:插入T1。第2步:插入T2。步骤3:用步骤2中的T2.ID更新t1? –

    +0

    是的,这是开始的想法 – Dima

    0

    刚刚在桌子上获得最大ID的情况如何?

    DECLARE @SomethingID INT 
    SELECT @SomethingID = MAX(SomethingID) FROM SomethingTable 
    
    +0

    这是不安全的,因为在插入和选择最大(id)查询之间有人可以执行另一个插入操作并破坏整个逻辑 – Dima

    +0

    是的,这是一个好点 –

    +0

    看看这个问题。它可能有助于解决最大问题:锁定几个表将会是坏 –

    相关问题