我有一个存储过程从表中获取数据,并在以下结构中的另一个表中创建记录:
TableA = Source Data
TableB = Destination 1
首先,我们从源表中查询所需的所有数据并将其插入TableB
。此表格中有一个名为identity
的{{1}}。
这是通过recordID
语句中的INSERT
完成的,该语句可能包含可变数量的记录。
完成此操作后,我需要使用Select
中TableA
的{{1}}更新名为TableBRef
的列。
我尝试使用recordID
,但因为它插入了多条记录,所以它只获取最后一条记录的ID。
我也尝试创建一个SQLFiddle但是看起来网站出现了问题,因为即使是样本小提琴我也会收到错误TableB
。
任何能够完成我需要的建议吗?
更新
以下是一些示例代码,因为SQLFiddle已关闭:
Scope_Identity()
答案 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更新@ data1UPDATE 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
这更符合您的需求吗?