2016-10-07 4 views
1

SQL Server 2016xmlを使用して日付/時刻をロードするときのエラーSQL Server

xmlでバルクレコードを処理しています。私は次のクエリを持っています:

DECLARE @xmlString VARCHAR(4000); 
    SET @xmlString = N' 
    <Customers> 
    <OrderID>10248</OrderID> 
    <CustomerID>VINET</CustomerID> 
    <CreateDate>10/7/2016 7:31:06 AM</CreateDate> 
    </Customers> 
    '; 

    DECLARE @xml XML; 
    SET @xml = CONVERT(XML, @xmlString); 

    INSERT INTO [test].dbo.[customers] 
    ([OrderID] , 
     [CustomerID] , 
     [CreateDate] 

    ) 
    SELECT T.Customer.value('(OrderID)[1]', 'INT') AS OrderID , 
      T.Customer.value('(CustomerID)[1]', 'nvarchar(20)') AS CustomerID , 
      T.Customer.value('(CreateDate)[1]', 'DATETIME') AS CreateDate 
    FROM @xml.nodes('Customers') AS T (Customer); 

私はCreateDateフィールドを削除すると、これはうまくロードされます。しかし、私はCreateDateフィールドを残して、私はこのエラーが表示されます:

CreateDateはDATETIMEフィールドです。ここで

はテーブルです:

CREATE TABLE [dbo].[Customers](
[OrderID] [INT] NULL, 
[CreateDate] [DATETIME] NOT NULL, 
[CustomerID] [NVARCHAR](10) NULL 
    ) ON [PRIMARY] 

私はXMLを介し私のテーブルに日付/時間をロードするために行方不明です何の変換?おかげ

+0

のようにそれを試して、戻ってあなたのため、このXMLを作成し誰に行くとエクスポートの日付/時刻形式としてISO 8601を使用するためにそれらを教えてください。 '2016年10月07日07時31分06秒は、変換するのにはるかに少ないトラブルがあります。これは、 "AM"がヒントを示すように、10/7がMM/DDであると仮定しています。ローカルフォーマットでは決して確信が持てません。 –

+0

@jeroen - 私はXMLを作成しています。私はISO 8601(つまり、2006-04-18T09:58:04.570)を試しましたが、まだ失敗しました。 – BoundForGlory

+0

私のマシンでこのコードを実行しました。多分、目的地テーブルを持つ何か?作成スクリプトを表示できますか? – gofr1

答えて

0

Use following if the XML date is in mm/dd/yyyy format

CONVERT(datetime, T.Customer.value('(CreateDate)[1]', 'nvarchar(50)'), 101) AS CreateDate

XMLの日付はDD/MM/YYYYのようないくつかの他の形式の場合 - 101

https://msdn.microsoft.com/en-us/library/ms187928.aspx

の代わりに置かれるべきであるかを調べるために、リンクの下をご覧ください。
+0

まだ同じエラーが出る – BoundForGlory

+0

残念ながら、T.Customer.value( '(CreateDate)[1]'、 'nvarchar(50)'にtypo 'nvarchar(50) ) ') ' – GauravKP

+1

完璧!...ありがとうございます – BoundForGlory

2

あなたのコメントでは、私はを作成しています。どのようにこれをやっている?

正しく作成されたXMLの日付/時刻の値はISO8601である必要があります。

コードの数行が表示されていないと、はXMLで考えるとです。 XMLは

それにもかかわらず、あなたのフォーマットがdd/mm/yyyyまたは101 mm/dd/yyyyため、用コード131で変換可能です...いくつかの余分な文字を単純なテキストではありませんが、あなたはこれを行うべきではありません!より良い

DECLARE @xml XML= 
N' 
    <Customers> 
    <OrderID>10248</OrderID> 
    <CustomerID>VINET</CustomerID> 
    <CreateDate>10/7/2016 7:31:06 AM</CreateDate> 
    </Customers> 
    '; 
SELECT c.value('OrderID[1]','int') AS OrderID 
     ,c.value('CustomerID[1]','nvarchar(100)') AS CustomerID 
     ,CONVERT(DATETIME,c.value('CreateDate[1]','nvarchar(100)'),101) AS CreateDate 
FROM @xml.nodes('Customers') AS A(c) 

可能ならば、この

DECLARE @xml2 XML= 
N' 
    <Customers> 
    <OrderID>10248</OrderID> 
    <CustomerID>VINET</CustomerID> 
    <CreateDate>2016-10-07T07:31:06</CreateDate> 
    </Customers> 
    '; 
SELECT c.value('OrderID[1]','int') AS OrderID 
     ,c.value('CustomerID[1]','nvarchar(100)') AS CustomerID 
     ,c.value('CreateDate[1]','datetime') AS CreateDate 
FROM @xml2.nodes('Customers') AS A(c) 
+0

この記事は同じことを言っていますhttp://p2p.wrox.com/book-professional-sql-server-2005-xml-isbn-0-7645-9792-2/74823-problem-loading-datetime-values-xml .html。私は上記のような日付をフォーマットし、それは働いた。しかし、私は@ GauravKPの答えで行くつもりです。私は私の質問と同じ形式で私の日付を残すことができ、それは動作します。ありがとう、私はこれを投票するつもりです。 – BoundForGlory

+0

@BoundForGlory、あなたが望むことはできますが、ニックネームを* BoundToTroubles * :-)に変更する必要があります。 – Shnugo

+0

@BoundForGlory、12日以上で出力を再チェックする必要があります。月を日とする。文化特有の日時フォーマットに頼るのは本当に悪い習慣です** ** – Shnugo

関連する問題