2009-08-14 45 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