说我有这个t-sql命令:
Insert into x(a,b) select a,b from y
虽然x包含10条记录,但其中两条记录在插入y时会产生错误,例如string should be truncated
或numeric overflow
。现在我想要的是当执行命令时,只会将8条记录插入到y中,这意味着将忽略所有错误记录。
这可能吗?
答案 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)