2

私は大量のストアド プロシージャを継承しましたが、それらは唯一のパラメータとして XML のブロックを受け取り、作成者はそれを (OPENXML を使用して) クラックし、行を更新します。

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

実行すると、次のエラーが発生します。

メッセージ 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 に答える