tsqlシュレッドxml-これは正しいですか、それともより良い方法がありますか(newbie @ shredding xml)

StackOverflow https://stackoverflow.com/questions/2992903

質問

わかりました、私は次のC#ASP.NET開発です。注文は、特定のデータセットを取得し、XMLを細断し、列を返すことです。私たちはすでに脱介入剤などのようなものや既知のタイプの複合体全体にアクセスできるASP.NET側でシュレッディングをする方が簡単だと主張しましたが、いいえ、上司は「サーバーでそれを細断します、サーバーでそれを細断します、データセットを返し、データセットをグリッドビューの列にバインドします。これはすべて、一緒に来て「悪い要件」と言う人たちから立ち去ることです。

手元のタスク:

これが私のコードです。

DECLARE @table1 AS TABLE (
    ProductID    VARCHAR(10)
  , Name         VARCHAR(20)
  , Color        VARCHAR(20)
  , UserEntered  VARCHAR(20)
  , XmlField     XML
)

INSERT INTO @table1 SELECT '12345','ball','red','john','<sizes><size name="medium"><price>10</price></size><size name="large"><price>20</price></size></sizes>'
INSERT INTO @table1 SELECT '12346','ball','blue','adam','<sizes><size name="medium"><price>12</price></size><size name="large"><price>25</price></size></sizes>'
INSERT INTO @table1 SELECT '12347','ring','red','john','<sizes><size name="medium"><price>5</price></size><size name="large"><price>8</price></size></sizes>'
INSERT INTO @table1 SELECT '12348','ring','blue','adam','<sizes><size name="medium"><price>8</price></size><size name="large"><price>10</price></size></sizes>'
INSERT INTO @table1 SELECT '23456','auto','black','ann','<auto><type>car</type><wheels>4</wheels><doors>4</doors><cylinders>3</cylinders></auto>'
INSERT INTO @table1 SELECT '23457','auto','black','ann','<auto><type>truck</type><wheels>4</wheels><doors>2</doors><cylinders>8</cylinders></auto><auto><type>car</type><wheels>4</wheels><doors>4</doors><cylinders>6</cylinders></auto>'

DECLARE @x XML
SELECT @x = (
    SELECT 
        ProductID
      , Name
      , Color
      , UserEntered
      , XmlField.query('
            for $vehicle in //auto
            return <auto 
                type = "{$vehicle/type}"
                wheels = "{$vehicle/wheels}"
                doors = "{$vehicle/doors}"
                cylinders = "{$vehicle/cylinders}"
            />')
    FROM @table1 table1
    WHERE Name = 'auto'
    FOR XML AUTO
)

SELECT @x

SELECT 
    ProductID    = T.Item.value('../@ProductID', 'varchar(10)')
  , Name         = T.Item.value('../@Name', 'varchar(20)')
  , Color        = T.Item.value('../@Color', 'varchar(20)')
  , UserEntered  = T.Item.value('../@UserEntered', 'varchar(20)')
  , VType        = T.Item.value('@type' , 'varchar(10)')
  , Wheels       = T.Item.value('@wheels', 'varchar(2)')
  , Doors        = T.Item.value('@doors', 'varchar(2)')
  , Cylinders    = T.Item.value('@cylinders', 'varchar(2)')
FROM   @x.nodes('//table1/auto') AS T(Item)

SELECT @x = (
    SELECT 
        ProductID
      , Name
      , Color
      , UserEntered
      , XmlField.query('
            for $object in //sizes/size
            return <size 
                name = "{$object/@name}"
                price = "{$object/price}"
            />')
    FROM @table1 table1
    WHERE Name IN ('ring', 'ball')
    FOR XML AUTO
)

SELECT @x

SELECT 
    ProductID    = T.Item.value('../@ProductID', 'varchar(10)')
  , Name         = T.Item.value('../@Name', 'varchar(20)')
  , Color        = T.Item.value('../@Color', 'varchar(20)')
  , UserEntered  = T.Item.value('../@UserEntered', 'varchar(20)')
  , SubName        = T.Item.value('@name' , 'varchar(10)')
  , Price       = T.Item.value('@price', 'varchar(2)')
FROM   @x.nodes('//table1/size') AS T(Item)

だから今のところ、私が今していることよりもコードを書くより良い方法があるかどうかを理解しようとしています...(私は持っています パート2 これと一緒に行くために...)

役に立ちましたか?

解決

クライアントでそれを行うのではなく、サーバー上のXMLを細断することは、さまざまな要因に依存するかどうかにかかわらず、要件は完全に有効かもしれません。広範なサポートSQL Server 2005を考慮して、XML(XPath/XQuery/XMLインデックス)を持っている後、サーバー上のXMLをシュレッドすることは、非常に賢明なアプローチです。

ただし、投稿にあるのは、XMLを使用したデータのセマンティックモデリングの例です。白い紙をいくつか見に行くことをお勧めします。

あなたの例の @Table1が単なる例であるか、生産で使用する実際のデータ構造であるかどうかはわかりませんが、それらの論文を読んだ後すぐにいくつかのポイントが飛び出します。

  • 可能な場合は型付けされたXMLを使用します(スキーマを追加)
  • 必要な処理に適切なXMLインデックスを使用する
  • 3つの連続したステップではなく、1つの変換ですべてのXMLを細断してみてください

そして最後に、細断する必要がある場合 毎日 クエリをする時間は、おそらくデータモデルを分析する必要があります(これは私のリストの最初の論文が役立つ場所です)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top