1

私はこの変数を持っています:

declare @xmlDoc XML

次のxmlが保存されています。

<?xml version="1.0" encoding="utf-8"?>
<NewDataSet>
  <Table1>
    <Sharedparam>shared</Sharedparam>
    <Antoher>sahre</Antoher>
    <RandomParam2>Good stuff</RandomParam2>
    <MoreParam>and more</MoreParam>
    <ResultsParam>2</ResultsParam>
  </Table1>
  <Table1>       
    <RandomParam2>do you</RandomParam2>
    <MoreParam>think</MoreParam>
    <ResultsParam>2</ResultsParam>
  </Table1>
  <Table1>
    <Sharedparam>Last</Sharedparam>
    <Antoher> Set </Antoher>
    <RandomParam2> of </RandomParam2>
    <MoreParam>values</MoreParam>
    <ResultsParam>are here</ResultsParam>
  </Table1>
  <Table1 />
</NewDataSet>

データを取得するために使用している次のクエリがあります。

declare @xmlDoc XML
set @xmlDoc = '' -- Stack Overflow could not handle the xml all on one line.

SELECT   -- Param 1
         TBL.SParam.value('local-name((*)[1])', 'varchar(50)') as Param1Name,
         TBL.SParam.value('(*)[1]', 'varchar(100)') as Param1Value,             
         -- Param2
         TBL.SParam.value('local-name((*)[2])', 'varchar(50)') as Param2Name,
         TBL.SParam.value('(*)[2]', 'varchar(100)') as Param2Value, 

         -- Param3           
         TBL.SParam.value('local-name((*)[3])', 'varchar(50)') as Param3Name,
         TBL.SParam.value('(*)[3]', 'varchar(100)') as Param3Value,

         -- Param 4
         TBL.SParam.value('local-name((*)[4])', 'varchar(50)') as Param4Name,
         TBL.SParam.value('(*)[4]', 'varchar(100)') as Param4Value,

         -- Param 5
         TBL.SParam.value('local-name((*)[5])', 'varchar(50)') as Param5Name,
         TBL.SParam.value('(*)[5]', 'varchar(100)') as Param5Value

 FROM    @xmldoc.nodes('/NewDataSet/Table1') AS TBL(SParam)  

結果にxmlファイルからの順序を追加する方法が必要です。(これはTable1の最初のインスタンスであり、次に2番目のインスタンスでした...)。

SQLテーブル変数の制限のため、これをまっすぐに保つためにID列を使用することはできません。(他の理由で、一時テーブルを使用したくありません。)

内部的に割り当てられたノードIDのようなものを返すクールなSQLXML関数があることを望んでいます。(または他の同様の注文方法。)

私はこのXML構造を制御していないので(私は読者のみです)、ID属性を追加するための変更を加えることはできません。

どんなアドバイスも素晴らしいでしょう!

編集/更新:

私は本当にこのようなデータが欲しいです:

1 | SharedParam | 共有
1 | Antoher | サーレ
1 | RandomParam2 | 良いもの
1 | MoreParam | もっと
1 | ResultsParam | もっと
2 | RandomParam2 | あなたは
2 | MoreParam | 考える
2 | ResultsParam | 2
3 | Sharedparam | 最後
3 | Antoher | セットする
。
。
。

しかし、私は不足しています。(多かれ少なかれ)列に入れることはできますが、番号付けの方法がわかりません。何かアイデアがあれば聞いてみたいです。

編集:
私はこれを行うためのクエリを理解しました(インターネットの助けを借りて)。次のようになります。

SELECT  TBL.SParam.value('local-name(.)[1]', 'varchar(50)') as ParamName,
        TBL.SParam.value('(.)[1]', 'varchar(50)') ParamValue, 
        TBL.SParam.value('for $s in . return count(../*[. << $s]) + 1', 'int') ParamPosition,
        TBL.SParam.value('for $s in . return count(../../*[. << $s]) - 1', 'int') ParamIteration 
FROM    @xmldoc.nodes('/NewDataSet/Table1/*') AS TBL(SParam)
4

2 に答える 2

3

数値テーブルとposition()を使用できます

 SELECT  N.Number as ID,
         -- Param 1
         TBL.SParam.value('local-name((*)[1])', 'varchar(50)') as Param1Name,
         TBL.SParam.value('(*)[1]', 'varchar(100)') as Param1Value,             
         -- Param2
         TBL.SParam.value('local-name((*)[2])', 'varchar(50)') as Param2Name,
         TBL.SParam.value('(*)[2]', 'varchar(100)') as Param2Value, 

         -- Param3           
         TBL.SParam.value('local-name((*)[3])', 'varchar(50)') as Param3Name,
         TBL.SParam.value('(*)[3]', 'varchar(100)') as Param3Value,

         -- Param 4
         TBL.SParam.value('local-name((*)[4])', 'varchar(50)') as Param4Name,
         TBL.SParam.value('(*)[4]', 'varchar(100)') as Param4Value,

         -- Param 5
         TBL.SParam.value('local-name((*)[5])', 'varchar(50)') as Param5Name,
         TBL.SParam.value('(*)[5]', 'varchar(100)') as Param5Value

 FROM master..spt_values as N
    cross apply @xmldoc.nodes('/NewDataSet/Table1[position()=sql:column("N.Number")]') AS TBL(SParam)
 where N.type = 'P' and
       N.number between 1 and @xmlDoc.value('count(/NewDataSet/Table1)', 'int')
于 2011-06-24T20:07:36.510 に答える
2

xqueryでposition()を完全にサポートするためのこの接続リクエストを見てくださいリクエスターはあなたに役立つかもしれないいくつかの回避策を提供します

2番目の回避策に基づいて、私は次のように書きました

SELECT  
         p.number,

         TBL.SParam.value('local-name((*)[1])', 'varchar(50)') as Param1Name,
         TBL.SParam.value('(*)[1]', 'varchar(100)') as Param1Value,             
         -- Param2
         TBL.SParam.value('local-name((*)[2])', 'varchar(50)') as Param2Name,
         TBL.SParam.value('(*)[2]', 'varchar(100)') as Param2Value, 

         -- Param3           
         TBL.SParam.value('local-name((*)[3])', 'varchar(50)') as Param3Name,
         TBL.SParam.value('(*)[3]', 'varchar(100)') as Param3Value,

         -- Param 4
         TBL.SParam.value('local-name((*)[4])', 'varchar(50)') as Param4Name,
         TBL.SParam.value('(*)[4]', 'varchar(100)') as Param4Value,

         -- Param 5
         TBL.SParam.value('local-name((*)[5])', 'varchar(50)') as Param5Name,
         TBL.SParam.value('(*)[5]', 'varchar(100)') as Param5Value
 FROM    
    master..spt_values p CROSS APPLY 


     @xmldoc.nodes('NewDataSet/Table1[position()=sql:column("p.number")]') AS TBL(SParam)  
 WHERE P.type = 'P'

これは次を返します

number      Param1Name                                         Param1Value                                                                                          Param2Name                                         Param2Value                                                                                          Param3Name                                         Param3Value                                                                                          Param4Name                                         Param4Value                                                                                          Param5Name                                         Param5Value
----------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------------------------------------------------------------------------------------
1           Sharedparam                                        shared                                                                                               Antoher                                            sahre                                                                                                RandomParam2                                       Good stuff                                                                                           MoreParam                                          and more                                                                                             ResultsParam                                       2
2           RandomParam2                                       do you                                                                                               MoreParam                                          think                                                                                                ResultsParam                                       2                                                                                                                                                       NULL                                                                                                                                                    NULL
3           Sharedparam                                        Last                                                                                                 Antoher                                             Set                                                                                                 RandomParam2                                        of                                                                                                  MoreParam                                          values                                                                                               ResultsParam                                       are here
4                                                              NULL                                                                                                                                                    NULL                                                                                                                                                    NULL                                                                                                                                                    NULL                                                                                                                                                    NULL

(4 row(s) affected)
于 2011-06-24T20:04:45.273 に答える