0

我在 T-SQL 中有以下内容:

INSERT INTO tblAttMain(Site, FirstName, LastName)
    SELECT 
        Site, FirstName, LastName
    FROM
        tblAttTmp 
    WHERE
        Site = @Site

我在这里所做的是将列复制tblAttTmptblAttMain表中。注意 select 语句可以返回数百行。tblAttTmp有一个名为 ID 的主键来指定该记录的特定 ID。

如果对于 select 的每次交互都出现错误,我想吐出tblAttTmp's ID 是什么并创建一个字符串,以便我可以看到所有需要修复的 ID。

不知道该怎么做,因为选择是一次性交易。

4

2 回答 2

4

正如你所说,select并且insert是“一枪”。你有两个真正的选择:

  1. 单独做每一行。这不仅不好,而且很痛苦
  2. 确定可能发生的“错误”(主键/唯一键/外键冲突、其他约束冲突等)并在尝试插入之前检查数据是否存在错误

(你真的需要使用第二个选项)。

于 2012-04-23T20:27:25.407 回答
0

听起来您宁愿将此解决方案实现为cursor。使用光标,您可以一次插入一个,而不是在每次迭代期间做一堆事情。

DECLARE @Cursor CURSOR FOR
SELECT Site, FirstName, LastName FROM tblAttTmp WHERE Site = @Site

DECLARE @CurrentSite <DataType>
DECLARE @CurrentFirstName <DataType>
DECLARE @CurrentLastName <DataType>

OPEN @Cursor

FETCH NEXT FROM @Cursor INTO @CurrentSite, @CurrentFirstName, @CurrentLastName

WHILE @@FETCH_STATUS = 0
BEGIN
   -- INSERT using @CurrentSite, @CurrentFirstName, @CurrentLastName
   -- Use a Try/ Catch block to catch errors

   FETCH NEXT FROM @Cursor INTO @CurrentSite, @CurrentFirstName, @CurrentLastName
END

CLOSE @Cursor
DEALLOCATE @Cursor
于 2012-04-23T20:28:59.407 回答