仅在不使用SELECT TOP时才会出现转换错误

时间:2017-09-07 08:01:23

标签: tsql

我有一个表格Col列可能包含或不包含字符串' geb。'。如果是这样,我想提取以下10个字符并将其转换为DATETIME

这是我的疑问:

;WITH CTE AS
(
    SELECT
        TOP 100000000
        Col,
        CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd
    FROM
        T
    WHERE
        Col LIKE '%geb.%'
)
SELECT
    Col,
    bd
FROM
    CTE
WHERE
    bd <= '01.01.1950'

以上查询工作正常。当我省略TOP xxx语句并且WHERE子句在任何方式中包含bd(IS NULL,= /!=&#39;&#39;,...)时,我收到转换错误:

  

从字符串

转换日期和/或时间时转换失败

当我在WHERE子句中包含TOP xxx或删除bd时,查询完成且没有错误。

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

这是因为当您不使用TOP条款或WHERE条件时,您最终会尝试转换某些col'geb.'后面的字符不能转换为DateTime

您正使用DateTimeselect条款 <来自TOP列表中的WHERE可兑换值 / p>

使用TRY_CONVERT代替:

TRY_CONVERT ( data_type [ ( length ) ], expression [, style ] )  

使用:

TRY_CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd

而不是:

CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd