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

use*_*158 6 database sql-server

我需要在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
Run Code Online (Sandbox Code Playgroud)

我的问题是如果发票表有数十亿的数据,如何找到行ID.有没有办法获得Row ID?请帮忙

Pரத*_*ீப் 9

使用ISDATE功能

如果表达式是有效的日期,时间或日期时间值,则返回1; 否则,0

select * 
from yourtable
where ISDATE([INVOICE DATE]) = 0
Run Code Online (Sandbox Code Playgroud)

SQL Server 2012+您可以使用TRY_CONVERT函数进行转换.

如果转换成功,则返回强制转换为指定数据类型的值; 否则,返回null.

如果字符串是有效日期,那么它将被转换为dateelse字符串将被转换为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)
;
Run Code Online (Sandbox Code Playgroud)

询问

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 
Run Code Online (Sandbox Code Playgroud)

结果:

???????????????????????????????????????????????????????????????????????
? 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 ?
???????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)


Eri*_*k A 5

我最近在将带有数值的字符串转换为数字数据类型时遇到了类似的问题。ISNUMERIC()不会这样做,因为它对于像'-'and这样的字符串返回 1 '-,',而 aCAST对于此类值则失败。

上面共享的技术不起作用,因为该列包含许多 Null 值和空字符串,并且这些应该转换为Null

在这种情况下,您可以使用PARSE来跟踪错误,因为 的错误消息PARSE包含导致错误的值。然后您可以使用子句搜索该值WHERE