TSQL插入后更新记录ID

时间:2015-02-17 16:16:24

标签: sql sql-server tsql stored-procedures sql-server-2012

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

TableA = Source Data
TableB = Destination 1

首先,我们从源表中查询所需的所有数据并将其插入TableB。此表格中有一个名为identity的{​​{1}}。

这是通过recordID语句中的INSERT完成的,该语句可能包含可变数量的记录。

完成此操作后,我需要使用SelectTableA的{​​{1}}更新名为TableBRef的列。

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

我也尝试创建一个SQLFiddle但是看起来网站出现了问题,因为即使是样本小提琴我也会收到错误TableB

任何能够完成我需要的建议吗?

更新

以下是一些示例代码,因为SQLFiddle已关闭:

Scope_Identity()

3 个答案:

答案 0 :(得分:0)

让我们设置一些表格:

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

答案 1 :(得分:0)

因为我们将数据插入带有新标识列的data2,所以我们丢失了源记录ID,所以我使用名称和手机查找我插入的内容 - 如果名称重复,手机可能无法正常工作是一些设计缺陷。 但是有些事情可以在下面试试

-- 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

答案 2 :(得分:0)

- 这是我们的源数据

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'

- 我现在需要使用从将数据插入@ data2

创建的recordID更新@ data1
UPDATE m
    set m.sourceID = d.recordID
FROM @data1 m
INNER JOIN @data2 d
    ON m.recordID = d.data1recid

这是输出:

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

这更符合您的需求吗?