【问题标题】:TSQL Updating record ID after insert插入后TSQL更新记录ID
【发布时间】:2015-02-17 16:16:23
【问题描述】:

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

TableA = Source Data
TableB = Destination 1

首先,我们从源表中查询我们需要的所有数据,并将其插入TableB。此表有一个名为recordIDidentity

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

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

我尝试使用Scope_Identity(),但由于它插入多条记录,它只获取最后一条记录的ID。

我也尝试创建一个 SQLFiddle,但似乎该站点存在问题,因为我在示例小提琴上也收到错误 Unknown Error Occurred: XML document structures must start and end within the same entity.:

有什么建议可以完成我所需要的吗?

更新:

这是一些示例代码,因为 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'

【问题讨论】:

  • 使用输出子句获取插入记录的新ID。
  • 拥有所有 ID 的列表是一回事,但知道它们与哪条记录相关联是我卡住的地方。如果我在@data2 上进行输出,我将得到一个插入的 id 列表。然后我需要知道哪条记录来自@data1 记录以便能够正确更新它?
  • 使用data1中的recordid向data2添加一列,您可以使用它来加入数据

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


【解决方案1】:

让我们设置一些表格:

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

这将存储来自插入语句的所有更新:

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

【讨论】:

  • 感谢您的回复。源表中的数据来自第 3 方,并包含一个名为 sourceID 的可为空字段。所以该表有一个名为recordIDPK 和一个名为sourceID 的列。我从不向@source 表中插入数据,我只更新它。在 @NewRecord 中创建记录后,我需要更新源表并说“这个 ID 是我创建新记录的原因,这个 ID 是它在 @newRecord 表中创建的记录。这有意义吗?
  • 凯文,同一个问题你回答了两次。请删除其中一个问题 - 或者您可以让社区决定删除哪个问题。
  • 我留下这个旧的只是为了显示用于从输入记录中提取新 id 的输出子句。
【解决方案2】:

因为当我们使用新的身份列将数据插入 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

【讨论】:

    【解决方案3】:

    -- 这是我们的源数据

    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 中创建的记录 ID 来更新 @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
    

    这是否更符合您的需要?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2022-01-26
      • 1970-01-01
      相关资源
      最近更新 更多