2009-08-14 36 views
2

我已经继承了大量的存储过程,它们将一个XML块作为其唯一参数,然后作者将其破解(使用OPENXML),然后更新一行。SQL,OPENXML和DateTime对话

我遇到的一个问题,同时更新具有datetime列一个表,下面是数据的一个片段,目前失败:

declare @stuff nvarchar (max); 

set @stuff = 
'<Booking xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <UpdatedDateTime>2009-08-14T15:32:09.7240556+01:00</UpdatedDateTime> 
</Booking>'; 

declare @iDoc int; 

exec sp_xml_preparedocument @idoc OUTPUT, @stuff; 

SELECT UpdatedDateTime 
    FROM 
     OPENXML(@idoc, '/*') 
    WITH 
    (
     UpdatedDateTime datetime 'UpdatedDateTime' 
    ) 

运行导致以下错误:

Msg 241, Level 16, State 1, Line 12

Conversion failed when converting datetime from character string.

如何将日期时间从XML片段转换为基于SQL的日期时间?

感谢

+0

这是SQL Server? – 2009-08-14 15:29:08

+0

是的,SQL Server 2005. – Kieron 2009-08-14 16:24:45

回答

2

尝试:

declare @stuff nvarchar (max); 

    set @stuff = 
    '<Booking xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <UpdatedDateTime>2009-08-14T15:32:09.7240556+01:00</UpdatedDateTime> 
    </Booking>'; 

    declare @iDoc int; 

    exec sp_xml_preparedocument @idoc OUTPUT, @stuff; 

    SELECT CONVERT(datetime,REPLACE(LEFT(UpdatedDateTime,23),'T',' ')),RIGHT(UpdatedDateTime,6) 
     ,CASE 
      WHEN LEFT(RIGHT(UpdatedDateTime,6),1)='+' THEN DATEADD(hh,CONVERT(int,LEFT(RIGHT(UpdatedDateTime,5),2)),CONVERT(datetime,REPLACE(LEFT(UpdatedDateTime,23),'T',' '))) 
      ELSE DATEADD(hh,-1*CONVERT(int,LEFT(RIGHT(UpdatedDateTime,5),2)),CONVERT(datetime,REPLACE(LEFT(UpdatedDateTime,23),'T',' '))) 
     END 

     FROM 
      OPENXML(@idoc, '/*') 
     WITH 
     (
      UpdatedDateTime varchar(100) 'UpdatedDateTime' 
     ) 

结果集:

----------------------- ------ ----------------------- 
2009-08-14 15:32:09.723 +01:00 2009-08-14 16:32:09.723 

(1 row(s) affected) 
+0

好的调用,除了这个来自SP是直接更新到表。 UpdatedDateTime在这种情况下是一个日期时间,而不是任何类型的字符串。 – Kieron 2009-08-14 15:16:42

+0

要使它工作,您将需要删除“T”和“+”偏移量 – 2009-08-14 15:20:57

+0

问题似乎比这更深, 2009-08-14 15:32:09.7240556会导致相同的问题。 – Kieron 2009-08-14 15:22:51