16

SQL Server Management Studio を使用して XML ファイルをテーブルに読み込むのは初めてです。おそらくもっと良い方法がありますが、このアプローチを使用したいと思います。

現在、人に関する記録の標準 XML ファイルを読み込んでいます。タグは、データの<record>各行の最上位レベルです。すべてのレコードを別々の行に読み取り、SQL テーブルに入れたいと考えています。

私はこれまでのところ、次のアプローチを使用してうまくやっています。

SELECT
        -- Record
        category, editor, entered, subcategory, uid, updated,
        -- Person
        first_name, last_name, ssn, ei, title, POSITION,
FROM OPENXML(@hDoc, 'records/record/person/names')
WITH 
(
    -- Record
    category [varchar](100) '../../@category',
    editor [varchar](100) '../../@editor',
    entered Datetime '../../@entered',
    subcategory [varchar](100) '../../@subcategory',
    uid BIGINT '../../@uid',
    updated [varchar](100) '../../@updated',
    -- Person
    first_name [varchar](100) 'first_name',
    last_name [varchar](100) 'last_name',
    ssn [varchar](100) '../@ssn',
    ei [varchar](100) '../@e-i',
    title [varchar](100) '../title',
    Position [varchar](100) '../position',  
)

ただし、タグ名はすべて各レコード/個人に固有であるため、このアプローチはうまく機能しました。私が抱えている問題は、複数のタグのリストを含むタグを<Person>持っているタグ内にあります。上記のアプローチを使用して'../aliases'を参照すると、すべての Alias 要素が 1 つの長い文字列行として混在して取得されます。「../aliases/alias」のみを試すと、レコード行ごとに最初の要素が返されます。Aliases タグ セット内に 10 個の Alias 要素があった場合、たとえば 10 行が返されます。<Aliases><Alias> test name </Alias>

上位レベルのタグ内に同じ名前のタグが複数ある場合に、1 行だけでなくすべてを返すように指定する方法はありますか?

以下は、私が参照している XML 内のブロックの例です。

- <aliases>
  <alias>test 1</alias> 
  <alias>test 2</alias> 
  <alias>test 3</alias> 
  </aliases>

SQL テーブルに次のものが必要です。

Record               Aliases

Record 1             test 1
Record 1             test 2
Record 1             test 3
Record 2             test 4
Record 2             test 5

しかし、私が得るのは次のとおりです。

Record 1             test 1 
Record 2             test 4

これを正しく説明していない場合はお詫び申し上げます - どんな助けでも大歓迎です。

4

4 に答える 4

0

FROM 句を次のように変更してみてください。

SELECT
...

FROM OPENXML(@hDoc, 'records/record/person/aliases')
于 2014-04-02T17:42:07.697 に答える
0

XML ファイルを扱うときは、次のようにしてノードを列に分割します。

次の形式のテーブルの列にある XML ファイル:

<CustomData>
<Name>Shaun</Name>
<Surname>Johnson</Surname>
<Title>Mr</Title>
<Age>29</Age>
</CustomData>

私が使用する Select ステートメント:

SELECT  
[ColumnName].value('(/CustomData//Name/node())[1]' , 'nvarchar(max)') AS Name,
[ColumnName].value('(/CustomData//Surname/node())[1]','nvarchar(max)') AS Surname,
[ColumnName].value('(/CustomData//Title/node())[1]' , 'nvarchar(max)') AS Title,
[ColumnName].value('(/CustomData//Age/node())[1]' , 'nvarchar(max)') AS Age
FROM TableName

結果:

Name  Surname  Title  Age
----  -------  -----  ---
Shaun Johnson  Mr     29
于 2014-09-18T08:32:14.953 に答える
-1

openxml はスカラー値を返す必要があります。OPENXML と結合した XML で .nodes メソッドを使用する必要があります。

于 2014-07-30T10:37:01.980 に答える