2

为什么这个说法会成功?

    SELECT CAST('08:50' as time)

但是这个失败了?tmrec是一个 nvarchar(6) 列并且包含相同的值'08:50'。自从过去 1 小时以来,这让我发疯了。

    SELECT   TOP 1 CAST(tmrec as time) 
    FROM     Instr 
    WHERE    igrp = 'JD' 
    ORDER BY ino , smallin

此屏幕截图显示了第一个查询的结果。它包含 08:50。然而第二个查询抛出错误。

编辑:

即使这样也不能保证转换仅应用于获取的记录:

    SELECT CAST( tmrec as time)
    FROM
         (
            SELECT TOP 1 tmrec
            FROM   [ccwise-courts].[dbo].[INSTR]
            WHERE  igrp = 'JD' 
            ORDER BY ino , smallin
         ) v
4

1 回答 1

3

通常,要查找不良数据,可以使用如下查询:

SELECT TOP(100) '-->' + REPLACE(tmrec, ' ', '*') + '<--bad'
FROM Instr
WHERE ISDATE(tmrec) = 0

如果您仍然无法弄清楚,您可以列出所涉及字符的特定 ASCII 代码(这里我每个问题最多 6 个):

SELECT TOP(100) '-->' + REPLACE(tmrec, ' ', '*') + '<--bad',
  Char1 = ascii(substring(tmrec,1,1)),
  Char2 = ascii(substring(tmrec,2,1)),
  Char3 = ascii(substring(tmrec,3,1)),
  Char4 = ascii(substring(tmrec,4,1)),
  Char5 = ascii(substring(tmrec,5,1)),
  Char6 = ascii(substring(tmrec,6,1))
FROM Instr
WHERE ISDATE(tmrec) = 0

在应用 WHERE 过滤器之前,有这个Connect 项在 SELECT 子句上处理 SQL Server 处理 CAST。为了克服这个问题,正如 bug 报告中所指出的,您可以使用 CASE 语句:

CAST(CASE WHEN ISDATE(tmrec)=1 THEN tmrec END as time)
于 2012-10-16T10:17:15.453 回答