Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
TSQL在插入后更新记录ID_Sql_Sql Server_Tsql_Stored Procedures_Sql Server 2012 - Fatal编程技术网

TSQL在插入后更新记录ID

TSQL在插入后更新记录ID,sql,sql-server,tsql,stored-procedures,sql-server-2012,Sql,Sql Server,Tsql,Stored Procedures,Sql Server 2012,我有一个存储过程,它从一个表中获取数据,并在另一个表中以以下结构创建记录: TableA = Source Data TableB = Destination 1 首先,我们从源表中查询所需的所有数据,并将其插入TableB。此表有一个名为recordID的标识 这是通过Select语句的INSERT来完成的,Select语句可能包含可变数量的记录 完成后,我需要使用从TableB中的插入创建的recordID更新TableA中名为TableBRef的列 我尝试使用Scope_Identity

我有一个存储过程,它从一个表中获取数据,并在另一个表中以以下结构创建记录:

TableA = Source Data
TableB = Destination 1
首先,我们从源表中查询所需的所有数据,并将其插入TableB。此表有一个名为recordID的标识

这是通过Select语句的INSERT来完成的,Select语句可能包含可变数量的记录

完成后,我需要使用从TableB中的插入创建的recordID更新TableA中名为TableBRef的列

我尝试使用Scope_Identity,但因为它插入了多条记录,所以它只获取最后一条记录的ID

我还尝试创建一个SQLFIDLE,但似乎该站点出现了问题,因为我收到了错误。发生了未知错误:XML文档结构必须在同一实体中开始和结束。示例FIDLE上的

有什么建议可以满足我的需求吗

更新:

以下是SQLFiddle关闭后的一些示例代码:

-- This is our source data
DECLARE @source TABLE (recordID INT IDENTITY (1,1), name VARCHAR(100), phone VARCHAR(20));

INSERT INTO @source(name , phone)
VALUES (
'Bob Desk', '123-456-7899',
'Don Mouse', '123-456-5555',
'Mike Keyboard', '123-456-7899',
'Billy Power', '122-222-1134'
)

-- This is the first step in the process - Inserting the records into our table
DECLARE @data1 TABLE (recordID INT IDENTITY (1,1), name VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT NULL, sourceID INT NULL)
SELECT name, phone
FROM @source;

-- Based on some condition, we take records from @data1 and insert them into @data2
DECLARE @data2 TABLE (recordID INT IDENTITY (1,1), name VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT null)
INSERT INTO @data2( name, phone)
SELECT name, phone
FROM @data1
WHERE phone <> '123-456-5555'

-- I now need to update @data1 with the recordID that was created from inserting the data into @data2
UPDATE @data1 SET SOURCEID = 'blah'

让我们设置一些表:

DECLARE @source TABLE 
(
    recordID INT IDENTITY (1,1), 
    name VARCHAR(100), 
    phone VARCHAR(20),
    sourceID INT
);
这将存储insert语句产生的所有更新:

DECLARE @NewRecord TABLE 
(
    recordID INT, 
    name VARCHAR(100), 
    phone VARCHAR(20)
);
现在我们插入记录,并将更新后的记录输出到表变量中,以获得新id:

INSERT INTO @source (name, phone)
OUTPUT inserted.recordid, inserted.name, inserted.phone INTO @NewRecord
VALUES 
('Bob Desk', '123-456-7899'),
('Don Mouse', '123-456-5555'),
('Mike Keyboard', '123-456-7899'),
('Billy Power', '122-222-1134')
以下是输出:

SELECT * FROM @NewRecord

recordID    name    phone
1   Bob Desk    123-456-7899
2   Don Mouse   123-456-5555
3   Mike Keyboard   123-456-7899
4   Billy Power 122-222-1134
SELECT * FROM @data1

recordID    name    phone   sourceID
1   Bob Desk    123-456-7899    1
2   Don Mouse   123-456-5555    NULL
3   Mike Keyboard   123-456-7899    2
4   Billy Power 122-222-1134    3

因为当我们使用新的标识列将数据插入data2时,我们丢失了源记录id,所以我使用了name和phone来查找我插入的内容-如果存在重复的名称,并且phone似乎存在一些设计缺陷,这可能无法正常工作。 但是下面有一些东西你可以试试

-- This is our source data
DECLARE @source TABLE (recordID INT IDENTITY (1,1), name VARCHAR(100), phone VARCHAR(20));

INSERT INTO @source(name , phone)
VALUES (
'Bob Desk', '123-456-7899'),
('Don Mouse', '123-456-5555'),
('Mike Keyboard', '123-456-7899'),
('Billy Power', '122-222-1134')

-- This is the first step in the process - Inserting the records into our table
DECLARE @data1 TABLE (recordID INT IDENTITY (1,1), name VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT NULL, sourceID INT NULL)
--Capture inserts using another table 
DECLARE @cdcapture1 TABLE (recordID INT , name VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT null)
INSERT INTO @data1(name,phone)
OUTPUT Inserted.recordID,Inserted.name,Inserted.phone INTO @cdcapture1
SELECT name, phone
FROM @source;


--Capture inserts using another table 
DECLARE @cdcapture2 TABLE (recordID INT , name VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT null)

-- Based on some condition, we take records from @data1 and insert them into @data2
DECLARE @data2 TABLE (recordID INT IDENTITY(1,1), name VARCHAR(100) NOT NULL, phone VARCHAR(20) NOT null)
INSERT INTO @data2( name, phone)
OUTPUT Inserted.*  INTO @cdcapture2
SELECT name, phone
FROM @cdcapture1 c1
--WHERE phone <> '123-456-5555'

-- Becuase when we are inserting data into data2 with new identity column so we lost source record id 
UPDATE  d1 
SET d1.sourceid = c2.recordid
FROM @data1 d1 INNER JOIN @cdcapture1 c1 ON d1.recordID = c1.recordID
INNER JOIN @cdcapture2 c2 ON c2.NAME = c1.NAME AND c2.phone = c1.phone


SELECT * FROM @data1

-这是我们的原始数据

DECLARE @source TABLE 
(
    recordID INT IDENTITY (1,1), 
    name VARCHAR(100), 
    phone VARCHAR(20)
);

INSERT INTO @source(name , phone)
VALUES 
('Bob Desk', '123-456-7899'),
('Don Mouse', '123-456-5555'),
('Mike Keyboard', '123-456-7899'),
('Billy Power', '122-222-1134');
-这是过程中的第一步-将记录插入到表中

DECLARE @data1 TABLE 
(
    recordID INT IDENTITY (1,1), 
    name VARCHAR(100) NOT NULL, 
    phone VARCHAR(20) NOT NULL, 
    sourceID INT NULL
)
INSERT INTO @data1 (name, phone )
SELECT name, phone
FROM @source;
-基于某些条件,我们从@data1获取记录并将其插入@data2

DECLARE @data2 TABLE 
(
    recordID INT IDENTITY (1,1), 
    name VARCHAR(100) NOT NULL, 
    phone VARCHAR(20) NOT null,
    data1recid INT
)

INSERT INTO @data2( name, phone, data1recid)
SELECT name, phone, recordID
FROM @data1
WHERE phone <> '123-456-5555'
UPDATE m
    set m.sourceID = d.recordID
FROM @data1 m
INNER JOIN @data2 d
    ON m.recordID = d.data1recid
以下是输出:

SELECT * FROM @NewRecord

recordID    name    phone
1   Bob Desk    123-456-7899
2   Don Mouse   123-456-5555
3   Mike Keyboard   123-456-7899
4   Billy Power 122-222-1134
SELECT * FROM @data1

recordID    name    phone   sourceID
1   Bob Desk    123-456-7899    1
2   Don Mouse   123-456-5555    NULL
3   Mike Keyboard   123-456-7899    2
4   Billy Power 122-222-1134    3

这更符合您的需要吗?

使用output子句获取要插入的记录的新id。拥有所有id的列表是一回事,但知道它们与哪条记录关联是我的难题。如果我在@data2上进行输出,我将有一个插入的ID列表。然后,我需要知道哪个记录来自@data1记录,以便能够正确地更新它?向data2添加一列,其中记录ID来自data1,您可以使用该列加入data1。感谢您的回复。源表中的数据来自第三方,并包含一个名为sourceID的可空字段。因此,该表有一个名为recordID的PK和一个名为sourceID的列。我从不在@source表中插入数据,我只更新它。一旦在@NewRecord中创建了记录,我需要更新源表,并说这个ID就是我创建新记录的原因,这个ID就是它在@NewRecord表中创建的记录。这有意义吗?凯文,你回答了两次同样的问题。请删除其中一个问题,或者您可以让社区决定删除哪个问题。我留下这个旧问题只是为了显示用于从输入记录中提取新id的output子句。