T-SQL:INSERT INTO

时间:2012-04-23 20:23:44

标签: sql-server tsql

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

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

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

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

不知道如何做,因为选择是一次性交易。

2 个答案:

答案 0 :(得分:4)

正如您所说,selectinsert是“一枪”。你有两个真正的选择:

  1. 单独执行每一行。 这不仅是坏事,也是一种痛苦
  2. 确定可能发生的“错误”(主要/唯一/外键冲突,其他约束违规等)和在尝试插入之前检查数据是否有错误。
  3. (你真的真的需要使用第二个选项)。

答案 1 :(得分: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