Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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,我有的桌子是 TableA {TableA_OID, TableB_OID, SomeFields} //Source Table TableB{TableB_OID, SomeFields} //Destination Table 我必须将一些数据从源表复制到目标表,如果复制成功,我希望将目标表的主键标识字段TableB_OID恢复到更新源表中的TableB_OID字段 我想您要选择范围\标识吗 这将执行一行操作: INSERT INTO TableB ( some

我有的桌子是

TableA {TableA_OID, TableB_OID, SomeFields} //Source Table

TableB{TableB_OID, SomeFields} //Destination Table

我必须将一些数据从源表复制到目标表,如果复制成功,我希望将目标表的主键标识字段TableB_OID恢复到更新源表中的TableB_OID字段

我想您要选择范围\标识吗

这将执行一行操作:

    INSERT INTO TableB (
        something
    )
    VALUES (
        'Some Value'
    )

    DECLARE @Id int
    SET @Id = scope_identity()

    UPDATE TableA SET tableB_OID = @Id WHERE TableA_OID = TableAId

如果需要一次复制多行,可以使用以下方法:

DECLARE @data TABLE(ID int, data varchar(50))

INSERT TableB( data )
OUTPUT Inserted.TableB_OID, INSERTed.data INTO @data
SELECT data FROM TableA 


UPDATE TableA 
SET TableB_OID=D.ID
FROM @data D JOIN TableA ON D.DATA=TableA.data

不过,它确实假设,在我的示例中,SomeField列数据中有一个唯一的键,否则您无法将标识数据关联回tableA。如果有,那么很好,否则,正如Steph所说,您将需要在TableB中添加一个TableA_OID字段,以便能够执行联接以写回数据。我认为以下操作会起作用,但我会首先使用一些大小合理的数据集:

DECLARE @TA TABLE (ID INT IDENTITY(1,1), AID INT)
INSERT @TA(AID) SELECT TableA_OID FROM TABLEA  -- ORDER BY data desc 
DECLARE @TB TABLE (ID INT IDENTITY(1,1), BID INT)

INSERT TableB( data )
OUTPUT Inserted.TableB_OID INTO @TB(BID)
SELECT data 
FROM @TA TA JOIN TableA ON TA.AID=TableA.TableA_OID ORDER BY TA.ID

SELECT * FROM @TA
SELECT * FROM @TB

UPDATE TableA 
SET TableB_OID=TB.BID
FROM @TB TB 
    JOIN @TA TA ON TB.ID=TA.ID
    JOIN TableA ON TA.AID=TableA.TableA_OID

SELECT * FROM TableA
SELECT * FROM TableB

首先,我们将对从表A中提取的数据施加一个顺序,并使用临时表中的标识列记录该顺序,链接到原始表A记录。然后,我们将使用该顺序将数据插入表B,并将结果输出记录到另一个临时表中。同样,我们将使用标识来记录序列。然后,我们将使用两个临时表中的标识值链接tableA和tableB行

,除非tableB中有tableA\u OID,您需要某种形式的业务密钥来匹配,以便能够执行更新,例如名称和地址提供了一个唯一的值组合,允许您根据另一个表更新一个表。我尝试将输出insert.MyPrimaryKey插入到tentrable中,现在我有两个临时表,一个带有源主键,另一个也按顺序具有目标主键。如何合并它们?是否保证数据以select查询获取数据的相同顺序插入?当然,如果您有一个可以匹配的键,那么所有这些都是多余的,因为您可以直接连接表,而不需要OUTPUT子句,即直接连接到表B,而不是问题所在的@data,我做了完全相同的事情创建了一个诱人的,并将所有插入的主键复制到其中,但是在输出插入部分,我可以从TableA.AnyField中选择一些东西吗?所以现在,我有两个临时表,一个有TableA_OID,另一个有TABLEB_OID,它们刚刚插入。现在,两个表中的数据都是按顺序排列的,合并两个表就可以完成我的任务,但我该怎么做呢?好的,我会发布一个备选方案,这对一个也可以,我必须在大容量数据的存储过程中这样做。您将数据按降序插入到TA中,但在TB中它是按升序插入的,应该是这样的吗?工作很有魅力,你太棒了!只需一个更改,请按顺序删除第二行中的描述抱歉,是的,降序只是为了稍微更改我的测试数据的顺序,以便我可以检查它是否工作