2015-06-10 2 views
1

Говорит у меня есть эта T-SQL команда:Игнорировать строки ошибок при вставке в таблицу

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

В то время как х содержит 10 записей, две из них будет генерировать ошибки при вставке в у, как string should be truncated или numeric overflow. Теперь, когда я хочу, когда команда будет выполнена, в y будет вставлено только 8 записей, что означает, что все записи ошибок будут проигнорированы.

Возможно ли это?

ответ

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) 
Смежные вопросы