2

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

我在更新具有日期时间列的表时遇到了一个问题,以下是当前失败的数据片段:

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'
    )

运行导致以下错误:

消息 241,第 16 级,状态 1,第 12 行

从字符串转换日期时间时转换失败。

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

谢谢

4

1 回答 1

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)
于 2009-08-14T15:14:42.973 回答