如何在sql中找到转换错误行

时间:2016-03-26 12:24:30

标签: sql-server database

我需要从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?请帮忙

2 个答案:

答案 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子句搜索该值。