2

XML ファイルを SQL Server 2008 R2 データ テーブルに読み込む方法を探しています。

私の XML ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
    <e_objects xmlns="http://www.blank.info/ns/2012/objects">
    <item  item_id="41-FE-001">
    <class display="true">
    <class_name>FEEDER</class_name>
    </class>
    </item>
</e_objects>

私の作成テーブルのSQLは次のようになります。

CREATE TABLE [dbo].[handover_data](
  [item_id] [nchar](15) NULL,
  [class] [nchar](10) NULL,
 ) ON [PRIMARY]
 GO

これは私が使用しているSQLです。値を返すことができません:

SELECT xmldata.value('(item[@name="item_id"]/@value)[1])', 'NCHAR') AS item_id,
xmldata.value('(class_name)', 'NCHAR') AS class       
FROM ( 
SELECT CAST(x AS XML)
FROM OPENROWSET(BULK 'C:\xmlfile.xml',
SINGLE_BLOB) AS T(x)) AS T(x)
CROSS APPLY x.nodes('e_objects/*') AS X(xmldata);

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

6

ええと、まず第一に、私がすでに回答した最後の質問のように、XML名前空間を無視しています-しないでください!

<e_objects xmlns="http://www.blank.info/ns/2012/objects">
           *********************************************

それがXML 名前空間です - それには理由があります - 無視しないでください!

その場合、XML ファイルの構造に注意を払っていません。あなたの<class_name>要素は要素の中に<class>あり、それもまたノードの中にあり<item>ます。したがって、それに応じて選択する必要があります。

また、XML 属性を選択するための構文が無効です。私のサンプルを見てください - それはあなたのために働きますか?

次のようなことを試してください:

;WITH XMLNAMESPACES(DEFAULT 'http://www.blank.info/ns/2012/objects')
SELECT 
    xmldata.value('(@item_id)[1]', 'NCHAR(10)') AS item_id,
    xmldata.value('(class/class_name)[1]', 'NCHAR(20)') AS class       
FROM 
    (SELECT CAST(x AS XML)
     FROM OPENROWSET(BULK 'C:\xmlfile.xml',
     SINGLE_BLOB) AS T(x)) AS T(x)
CROSS APPLY 
    x.nodes('/e_objects/item') AS X(xmldata);

これにより、 asの<item>下にあるすべてのノードのリストが取得されます。それらの要素から、次に選択します<e_objects>X(xmldata)

  • ノード自体のitem_id属性<item>
  • ノード内に含まれる<class>/<class_name>要素<item>

また、あまり使用しないNCHARことをお勧めします-固定長です。つまり、文字列が2文字しかない場合でも、常に10または20文字です。NVARCHAR(20)文字列の長さが >= 5の場合は、ほとんどのタイプを代わりに使用することをお勧めします。

于 2012-07-24T13:33:34.960 に答える
1

xml 列を含むテーブルを作成して、列を格納します。これを試してください、それは私にとってはうまくいきます

    CREATE TABLE XmlImportTest
    (
        xmlFileName VARCHAR(300),
        xml_data xml
    )
    GO

    DECLARE @xmlFileName VARCHAR(300)
    SELECT  @xmlFileName = 'C:\xmlPath.xml'
    -- dynamic sql is just so we can use @xmlFileName variable in OPENROWSET
    EXEC('
    INSERT INTO XmlImportTest(xmlFileName, xml_data)

    SELECT ''' + @xmlFileName + ''', xmlData 
    FROM
    (
        SELECT  * 
        FROM    OPENROWSET (BULK ''' + @xmlFileName + ''' , SINGLE_BLOB) AS XMLDATA
    ) AS FileImport (XMLDATA)
    ')
    GO
    SELECT * FROM XmlImportTest

    DROP TABLE XmlImportTest

参照: http://weblogs.sqlteam.com/mladenp/archive/2007/06/18/60235.aspx

于 2012-07-24T13:19:40.650 に答える