SQL Server:“从字符串转换日期时间时转换失败。”

问题描述:

我想要的结果从视图复制到使用表:SQL Server:“从字符串转换日期时间时转换失败。”

insert into tableA 
    select * from viewB order by id; 

我得到错误信息 -

Msg 241, Level 16, State 1, Line 1 
Conversion failed when converting datetime from character string. 

表A和ViewB有大约80场。试图找出哪一个可能有类型不匹配将永远。如何快速确定哪一列导致错误?

+1

tableA中有多少个datetime列?看看那些 – Scoregraphic 2009-09-14 09:56:59

+0

是的,同意 - 那些类似的信息“出了问题”是非常没有意义的.....一直在想自己为什么SQL Server团队不能设法至少告诉我们**什么**列导致此转换失败....... – 2009-09-14 10:08:54

这将使你在TableA有一个日期相关的类型(DATE,DATETIME,DATETIME2,DATETIMEOFFSET等)的所有列的列表:

SELECT * 
FROM sys.columns 
WHERE object_id = object_id('TableA') 
AND system_type_id IN (40, 42, 43, 58, 61) 
ORDER BY name 

你可以在两个表上运行这一点,看看你是否发现任何差异。

或者你可以在两个表上运行这一点 - 它会给你的列清单(名称)及其相关的数据类型:

SELECT 
    c.NAME, 
    t.name 
FROM sys.columns c 
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id 
WHERE object_id = object_id('TableA') 
ORDER BY c.name 

也许你会看到在表B的列的类型为varchar这是的被映射到TableA中DATETIME类型的列,然后以这种方式找到您的罪魁祸首。

Marc

+0

使用顶部方法将其限制在大约20列我必须检查。我最终找到了它。 看起来你可能会重写底部方法,所以它会输出视图和表中的字段相互紧挨着。 – wkstar 2009-09-14 15:12:44

+0

您的第二个查询可能被'EXEC sp_columns'TableA''替换,您将得到完整的列描述。 – Scoregraphic 2009-09-15 07:23:02

+0

是的,但是然后你正在处理一个存储的proc输出 - 不是一个很好的表格,你可以选择其他字段,顺序等等。我更喜欢通过这些内置存储过程的系统目录视图 – 2009-09-15 07:38:21

他们大多是DATETIME字段?看起来它试图将一个字符串推入DATETIME,因此您可以先查看前几个字符串。

不应该花太长时间。

作为一种调试功能,您可能希望从视图中执行选择查询,然后将它们在单个插入中按下到tableA中。

然后它会抛出一个包含哪个列无法插入的错误。假设您可以手动执行此操作。除此之外,有没有什么办法可以避免有一个字符串作为你的日期时间列?

您的某个领域的数据不完整。使用isdate()函数检查应包含日期的每个字段。

Select idfield, mydatefield from mytable where isdate(mydatefield) = 0 

您将看到包含无效日期的记录。这是将日期存储为字符串数据绝不是好主意的原因之一。