插入表时忽略错误行

时间:2015-06-10 10:48:27

标签: sql-server-2008

说我有这个t-sql命令:

Insert into x(a,b) select a,b from y 

虽然x包含10条记录,但其中两条记录在插入y时会产生错误,例如string should be truncatednumeric overflow。现在我想要的是当执行命令时,只会将8条记录插入到y中,这意味着将忽略所有错误记录。

这可能吗?

1 个答案:

答案 0 :(得分:0)

无法理解,为什么会有这样的要求。解决方案在那里,但仍然不满足要求或者说不能消化这种情况。

你可以逐个遍历每个记录,如果没有错误则插入。 试试这个

Set Nocount On;

Declare  @Id            Int
        ,@Total         Int
        ,@Loop          Int
        ,@a             Varchar(5)
        ,@b             Numeric(3,1)

If Object_Id('tempdb.dbo.#x') Is Not Null
Begin
    Drop Table #x;
End

If Object_Id('tempdb.dbo.#y') Is Not Null
Begin
    Drop Table #y;
End

Create Table #x
(
     Id         Int Identity(1,1) Primary Key
    ,a          Varchar(5)
    ,b          Numeric(3,1)
)

Create Table #y
(
     Id         Int Identity(1,1) Primary Key
    ,a          Varchar(10)
    ,b          Numeric(5,2)
)

Insert Into #y(a,b)
Values 
 ('abcdef',200)
,('abc',12)
,('abfdef',260)
,('34c',16)
,('abwe',18)
,('asdc',29)
,('3fgc',17)
,('a45we',88)
,('a3d7',49)
,('a367',48)

Select   @Total = Count(*)
        ,@Id = 0
        ,@Loop = 0
From    #y With (Nolock)

While (@Loop < @Total)
Begin
    Select  Top 1
             @Id = y.Id
            ,@a = Substring(y.a,0,5)
            ,@b = Cast(y.b As Numeric(3,1))
    From    #y As y With (Nolock)
    Where   y.Id > @Id
    Order By y.Id Asc

    If @@Error <> 0 Goto NextLevel

    Insert Into #x
    Select   @a
            ,@b

    Goto NextLevel

    NextLevel:
    Select  @Loop = @Loop + 1
End

Select  *
From    #x With (Nolock)