我知道关于这个话题有很多问题,甚至是我不久前问过自己的一个(这里)。现在我遇到了一个不同的问题,我自己和我的同事都不知道这种奇怪行为的原因是什么。
我们有一个相对简单的 SQL 语句,如下所示:
SELECT
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) AS MyDate,
SomeOtherColumn,
...
FROM
MyTable
INNER JOIN MyOtherTable
ON MyTable.ID = MyOtherTable.MyTableID
WHERE
MyTable.ID > SomeValue AND
MyText LIKE 'Date: %'
这不是我的数据库,也不是我的 SQL 语句,而且我没有创建出色的模式来将日期时间值存储在 varchar 列中,所以请忽略这一点。
我们现在面临的问题是 SQL 转换错误 241(“从字符串转换日期和/或时间时转换失败。”)。
现在我知道查询优化器可能会更改执行计划,在尝试转换后可以使用 WHERE 子句过滤结果,但真正奇怪的是,当我删除所有 WHERE 子句时,我没有收到任何错误.
当我在上面的语句中添加一行时,我也没有收到任何错误,如下所示:
SELECT
MyText, -- This is the added line
CONVERT(DATETIME, SUBSTRING(MyText, CHARINDEX('Date:', MyText) + 8, 16) AS MyDate,
...
一旦我删除它,我就会再次收到转换错误。手动检查 MyText 列中的值而不尝试转换它们并不表明存在任何可能导致问题的记录。
转换错误的原因是什么?当我还选择列作为 SELECT 语句的一部分时,为什么我没有遇到它?
更新
这里是执行计划,虽然我认为它不会有帮助。