在SQL Server里insert的时候怎么跳过报错的某一行?继续执行下一行?

墙头上乘凉 2017-07-24 10:11:32
在SQL Server里insert的时候怎么跳过报错的某一行?继续执行下一行?

比如在插入的时候,有10条数据需要插入,但第6条插入的时候报数据类型转换出错,我需要 先跳过这一条继续插入第7条,SQL语句有办法做出来吗?



实际数据有500多万条。
...全文
1432 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 17 楼 yenange 的回复:
看上面的图
谢谢!
吉普赛的歌 2017-08-02
  • 打赏
  • 举报
回复
引用 15 楼 baidu_36457652 的回复:
还是没得这个兼容性设置,而且我输入try_convert时 他会弹出这个函数 以及他的参数什么的,但是运行就报不是内置函数。 而且 try_cast 是可用的。
看上面的图
吉普赛的歌 2017-08-02
  • 打赏
  • 举报
回复
@baidu_36457652
@530303869

  • 打赏
  • 举报
回复
引用 14 楼 yenange 的回复:
[quote=引用 13 楼 baidu_36457652 的回复:]
[quote=引用 12 楼 yenange 的回复:]
右键-》“属性”-》“选项”-》“兼容性级别”
看下你所在的数据库的兼容性级别是不是 2014 ?

没有 兼容性级别设置。
[/quote]
你搞错了, 应该在数据库上右键, 不是实例的连接上。[/quote]
还是没得这个兼容性设置,而且我输入try_convert时 他会弹出这个函数 以及他的参数什么的,但是运行就报不是内置函数。
而且 try_cast 是可用的。
吉普赛的歌 2017-08-02
  • 打赏
  • 举报
回复
引用 13 楼 baidu_36457652 的回复:
[quote=引用 12 楼 yenange 的回复:] 右键-》“属性”-》“选项”-》“兼容性级别” 看下你所在的数据库的兼容性级别是不是 2014 ?
没有 兼容性级别设置。 [/quote] 你搞错了, 应该在数据库上右键, 不是实例的连接上。
  • 打赏
  • 举报
回复
引用 12 楼 yenange 的回复:
右键-》“属性”-》“选项”-》“兼容性级别”
看下你所在的数据库的兼容性级别是不是 2014 ?

没有 兼容性级别设置。
吉普赛的歌 2017-08-02
  • 打赏
  • 举报
回复
引用 11 楼 baidu_36457652 的回复:
[quote=引用 6 楼 yenange 的回复:]
--查看下你SQL Server的版本
SELECT @@VERSION
--如果是SQL Server2012 或更高版本可以用系统自带的 TRY_CONVERT 来实现
USE tempdb
GO
IF OBJECT_ID('[target]') IS NOT NULL DROP TABLE [target]
IF OBJECT_ID('[source]') IS NOT NULL DROP TABLE [source]
CREATE TABLE [target](t_id INT IDENTITY(1,1), t_c1 XML)
CREATE TABLE [source](s_id INT IDENTITY(1,1), s_c1 NVARCHAR(20))
SET NOCOUNT ON
INSERT INTO [source](s_c1) VALUES('<x>1</x>')
INSERT INTO [source](s_c1) VALUES('<x>2</x>')
INSERT INTO [source](s_c1) VALUES('<x>3</x>')
INSERT INTO [source](s_c1) VALUES('<x>4</x>')
INSERT INTO [source](s_c1) VALUES('<x>5</x>')
INSERT INTO [source](s_c1) VALUES('<x>6')
INSERT INTO [source](s_c1) VALUES('<x>7</x>')
INSERT INTO [source](s_c1) VALUES('<x>8</x>')
INSERT INTO [source](s_c1) VALUES('<x>9</x>')
INSERT INTO [source](s_c1) VALUES('<x>10</x>')
 
INSERT INTO [target](t_c1)
SELECT [s_c1] FROM [source] WHERE TRY_CONVERT(XML, s_c1 ) IS NOT NULL
 
--很明显 第 6 条有问题的数据没有插入进来
SELECT * FROM [target]
/*
t_id	t_c1
1	<x>1</x>
2	<x>2</x>
3	<x>3</x>
4	<x>4</x>
5	<x>5</x>
6	<x>7</x>
7	<x>8</x>
8	<x>9</x>
9	<x>10</x>
*/
为啥我的 sql server 2014 显示 try_convert 不是可识别的内置函数?[/quote] 右键-》“属性”-》“选项”-》“兼容性级别” 看下你所在的数据库的兼容性级别是不是 2014 ?
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
--查看下你SQL Server的版本
SELECT @@VERSION
--如果是SQL Server2012 或更高版本可以用系统自带的 TRY_CONVERT 来实现
USE tempdb
GO
IF OBJECT_ID('[target]') IS NOT NULL DROP TABLE [target]
IF OBJECT_ID('[source]') IS NOT NULL DROP TABLE [source]
CREATE TABLE [target](t_id INT IDENTITY(1,1), t_c1 XML)
CREATE TABLE [source](s_id INT IDENTITY(1,1), s_c1 NVARCHAR(20))
SET NOCOUNT ON
INSERT INTO [source](s_c1) VALUES('<x>1</x>')
INSERT INTO [source](s_c1) VALUES('<x>2</x>')
INSERT INTO [source](s_c1) VALUES('<x>3</x>')
INSERT INTO [source](s_c1) VALUES('<x>4</x>')
INSERT INTO [source](s_c1) VALUES('<x>5</x>')
INSERT INTO [source](s_c1) VALUES('<x>6')
INSERT INTO [source](s_c1) VALUES('<x>7</x>')
INSERT INTO [source](s_c1) VALUES('<x>8</x>')
INSERT INTO [source](s_c1) VALUES('<x>9</x>')
INSERT INTO [source](s_c1) VALUES('<x>10</x>')
 
INSERT INTO [target](t_c1)
SELECT [s_c1] FROM [source] WHERE TRY_CONVERT(XML, s_c1 ) IS NOT NULL
 
--很明显 第 6 条有问题的数据没有插入进来
SELECT * FROM [target]
/*
t_id	t_c1
1	<x>1</x>
2	<x>2</x>
3	<x>3</x>
4	<x>4</x>
5	<x>5</x>
6	<x>7</x>
7	<x>8</x>
8	<x>9</x>
9	<x>10</x>
*/
为啥我的 sql server 2014 显示 try_convert 不是可识别的内置函数?
墙头上乘凉 2017-07-27
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
--查看下你SQL Server的版本
SELECT @@VERSION
--如果是SQL Server2012 或更高版本可以用系统自带的 TRY_CONVERT 来实现
USE tempdb
GO
IF OBJECT_ID('[target]') IS NOT NULL DROP TABLE [target]
IF OBJECT_ID('[source]') IS NOT NULL DROP TABLE [source]
CREATE TABLE [target](t_id INT IDENTITY(1,1), t_c1 XML)
CREATE TABLE [source](s_id INT IDENTITY(1,1), s_c1 NVARCHAR(20))
SET NOCOUNT ON
INSERT INTO [source](s_c1) VALUES('<x>1</x>')
INSERT INTO [source](s_c1) VALUES('<x>2</x>')
INSERT INTO [source](s_c1) VALUES('<x>3</x>')
INSERT INTO [source](s_c1) VALUES('<x>4</x>')
INSERT INTO [source](s_c1) VALUES('<x>5</x>')
INSERT INTO [source](s_c1) VALUES('<x>6')
INSERT INTO [source](s_c1) VALUES('<x>7</x>')
INSERT INTO [source](s_c1) VALUES('<x>8</x>')
INSERT INTO [source](s_c1) VALUES('<x>9</x>')
INSERT INTO [source](s_c1) VALUES('<x>10</x>')
 
INSERT INTO [target](t_c1)
SELECT [s_c1] FROM [source] WHERE TRY_CONVERT(XML, s_c1 ) IS NOT NULL
 
--很明显 第 6 条有问题的数据没有插入进来
SELECT * FROM [target]
/*
t_id	t_c1
1	<x>1</x>
2	<x>2</x>
3	<x>3</x>
4	<x>4</x>
5	<x>5</x>
6	<x>7</x>
7	<x>8</x>
8	<x>9</x>
9	<x>10</x>
*/
太感谢你了,让我学到了一些新知识。 之后我试一下,那个问题我先手动排错解决了。
墙头上乘凉 2017-07-27
  • 打赏
  • 举报
回复
引用 8 楼 wmxcn2000 的回复:
那就用游标处理,每行单独的 insert 一下,每行都 try catch 一下。 PS:数据量太多的话,效率估计接受不了。
数量500多万,估计会服务器会受不了
吉普赛的歌 2017-07-24
  • 打赏
  • 举报
回复
--查看下你SQL Server的版本
SELECT @@VERSION
--如果是SQL Server2012 或更高版本可以用系统自带的 TRY_CONVERT 来实现
USE tempdb
GO
IF OBJECT_ID('[target]') IS NOT NULL DROP TABLE [target]
IF OBJECT_ID('[source]') IS NOT NULL DROP TABLE [source]
CREATE TABLE [target](t_id INT IDENTITY(1,1), t_c1 XML)
CREATE TABLE [source](s_id INT IDENTITY(1,1), s_c1 NVARCHAR(20))
SET NOCOUNT ON
INSERT INTO [source](s_c1) VALUES('<x>1</x>')
INSERT INTO [source](s_c1) VALUES('<x>2</x>')
INSERT INTO [source](s_c1) VALUES('<x>3</x>')
INSERT INTO [source](s_c1) VALUES('<x>4</x>')
INSERT INTO [source](s_c1) VALUES('<x>5</x>')
INSERT INTO [source](s_c1) VALUES('<x>6')
INSERT INTO [source](s_c1) VALUES('<x>7</x>')
INSERT INTO [source](s_c1) VALUES('<x>8</x>')
INSERT INTO [source](s_c1) VALUES('<x>9</x>')
INSERT INTO [source](s_c1) VALUES('<x>10</x>')
 
INSERT INTO [target](t_c1)
SELECT [s_c1] FROM [source] WHERE TRY_CONVERT(XML, s_c1 ) IS NOT NULL
 
--很明显 第 6 条有问题的数据没有插入进来
SELECT * FROM [target]
/*
t_id	t_c1
1	<x>1</x>
2	<x>2</x>
3	<x>3</x>
4	<x>4</x>
5	<x>5</x>
6	<x>7</x>
7	<x>8</x>
8	<x>9</x>
9	<x>10</x>
*/
墙头上乘凉 2017-07-24
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
USE tempdb
GO
IF OBJECT_ID('[target]') IS NOT NULL DROP TABLE [target]
IF OBJECT_ID('[source]') IS NOT NULL DROP TABLE [source]
CREATE TABLE [target](t_id INT IDENTITY(1,1), t_c1 INT)
CREATE TABLE [source](s_id INT IDENTITY(1,1), s_c1 NVARCHAR(20))
SET NOCOUNT ON
INSERT INTO [source](s_c1) VALUES('1')
INSERT INTO [source](s_c1) VALUES('2')
INSERT INTO [source](s_c1) VALUES('3')
INSERT INTO [source](s_c1) VALUES('4')
INSERT INTO [source](s_c1) VALUES('5')
INSERT INTO [source](s_c1) VALUES('d')
INSERT INTO [source](s_c1) VALUES('7')
INSERT INTO [source](s_c1) VALUES('8')
INSERT INTO [source](s_c1) VALUES('9')
INSERT INTO [source](s_c1) VALUES('10')

INSERT INTO [target](t_c1)
SELECT [s_c1] FROM [source] WHERE ISNUMERIC(s_c1)=1

--很显示 第 6 条有问题的数据没有插入进来
SELECT * FROM [target]
/*
t_id	t_c1
1	1
2	2
3	3
4	4
5	5
6	7
7	8
8	9
9	10
*/
我现在要做的是,将源表的某一列转换为XML格式插入到另一张表为XML类型的字段里,源表的这个字段存的都是XML的数据,他的字段类型为text,但这个字段里有很多转换XML格式错误的数据。 SQL里面有没有ISXML这种函数,这种情况有没有什么更简便的方法处理?
二月十六 2017-07-24
  • 打赏
  • 举报
回复
如果是批量插入的没办法一条数据出错了再继续执行;最好是插入前检查好数据类型,做处理,或者插入数据的时候做一下类型判断等
吉普赛的歌 2017-07-24
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('[target]') IS NOT NULL DROP TABLE [target]
IF OBJECT_ID('[source]') IS NOT NULL DROP TABLE [source]
CREATE TABLE [target](t_id INT IDENTITY(1,1), t_c1 INT)
CREATE TABLE [source](s_id INT IDENTITY(1,1), s_c1 NVARCHAR(20))
SET NOCOUNT ON
INSERT INTO [source](s_c1) VALUES('1')
INSERT INTO [source](s_c1) VALUES('2')
INSERT INTO [source](s_c1) VALUES('3')
INSERT INTO [source](s_c1) VALUES('4')
INSERT INTO [source](s_c1) VALUES('5')
INSERT INTO [source](s_c1) VALUES('d')
INSERT INTO [source](s_c1) VALUES('7')
INSERT INTO [source](s_c1) VALUES('8')
INSERT INTO [source](s_c1) VALUES('9')
INSERT INTO [source](s_c1) VALUES('10')

INSERT INTO [target](t_c1)
SELECT [s_c1] FROM [source] WHERE ISNUMERIC(s_c1)=1

--很显示 第 6 条有问题的数据没有插入进来
SELECT * FROM [target]
/*
t_id	t_c1
1	1
2	2
3	3
4	4
5	5
6	7
7	8
8	9
9	10
*/
墙头上乘凉 2017-07-24
  • 打赏
  • 举报
回复
引用 1 楼 yenange 的回复:
你的sql 语句是怎么写的? insert into t(c1,c2,...) values(...) insert into t(c1,c2,...) values(...) insert into t(c1,c2,...) values(...) 还是: insert into t(c1,c2,...) select * from t2 where ... ?
第二种
吉普赛的歌 2017-07-24
  • 打赏
  • 举报
回复
你的sql 语句是怎么写的? insert into t(c1,c2,...) values(...) insert into t(c1,c2,...) values(...) insert into t(c1,c2,...) values(...) 还是: insert into t(c1,c2,...) select * from t2 where ... ?
卖水果的net 2017-07-24
  • 打赏
  • 举报
回复
那就用游标处理,每行单独的 insert 一下,每行都 try catch 一下。 PS:数据量太多的话,效率估计接受不了。
LongRui888 2017-07-24
  • 打赏
  • 举报
回复
因为你是insert select的写法,所以是没办法跳过错误,继续的,如果有错,就会回滚所有数据。 你这种情况,建议把错误数据查出来,做一下特殊处理

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧