我需要从sql中的表中找到导致行的错误 例如:
我们有发票表,如果我需要转换发票日期列,由于行ID 4上存在特殊字符而导致错误
Row ID INVOICE DATE AMOUNT
1 05/22/2015 25
2 05/27/2015 85
3 05/17/2015 15
4 , 28
如果发票表有数十亿的数据,我的问题是如何找到行ID。 有没有办法获得Row ID?请帮忙
答案 0 :(得分:8)
使用ISDATE
功能
如果表达式是有效的日期,时间或日期时间值,则返回1; 否则,0
select *
from yourtable
where ISDATE([INVOICE DATE]) = 0
在SQL Server 2012+
中,您可以使用TRY_CONVERT
功能进行转换。
如果转换成功,则返回强制转换为指定数据类型的值; 否则,返回null。
如果字符串是有效日期,则它将转换为date
否则字符串将转换为NULL
更新:根据您的评论
示例数据
CREATE TABLE test_tab
([Row ID] int, [INVOICE DATE] varchar(10), [AMOUNT] int)
;
INSERT INTO test_tab
([Row ID], [INVOICE DATE], [AMOUNT])
VALUES
(1, '05/22/2015', 25),
(2, '05/27/2015', 85),
(3, '05/17/2015', 15),
(4, ',', 28)
;
<强>查询强>
SELECT [Row ID],
Try_convert(date, [INVOICE DATE]) AS [INVOICE DATE],
amount,
CASE
WHEN Try_convert(date, [INVOICE DATE]) IS NULL THEN Concat('Row ID ', [Row ID], ' has some conversion issue')
ELSE 'Valid Date'
END AS comments
FROM test_tab
<强>结果:强>
╔════════╦══════════════╦════════╦════════════════════════════════════╗
║ Row ID ║ INVOICE DATE ║ amount ║ comments ║
╠════════╬══════════════╬════════╬════════════════════════════════════╣
║ 1 ║ 2015-05-22 ║ 25 ║ Valid Date ║
║ 2 ║ 2015-05-27 ║ 85 ║ Valid Date ║
║ 3 ║ 2015-05-17 ║ 15 ║ Valid Date ║
║ 4 ║ NULL ║ 28 ║ Row ID 4 has some conversion issue ║
╚════════╩══════════════╩════════╩════════════════════════════════════╝
答案 1 :(得分:0)
我最近在将带有数值的字符串转换为数字数据类型时遇到了类似的问题。 ISNUMERIC()
不会这样做,因为它为'-'
和'-,'
这样的字符串返回1,而CAST
对这些值失败。
上面分享的技术不起作用,因为该列包含许多Null值和空字符串,这些应该被转换为Null
您可以使用PARSE
在这种情况下跟踪错误,因为PARSE
的错误消息包含导致错误的值。然后,您可以使用WHERE
子句搜索该值。