为什么这个陈述会成功?
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
This screenshot显示第一个查询的结果。它包含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
答案 0 :(得分: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 item处理SQL Server在SELECT子句上处理CAST。为了克服这个问题,如错误报告中所述,您可以使用CASE语句:
CAST(CASE WHEN ISDATE(tmrec)=1 THEN tmrec END as time)