7

XML 形式で渡されるアプリケーションのプロパティがいくつかあります。プロパティを名前で解析し、値をデータベースの適切な列に割り当てる必要があります。

現在、SSIS スクリプト コンポーネントで解析していますが、完了するまでに時間がかかります。XQUERY を使用してこれを簡単に解決できることを期待していましたが、探しているものが見つかりません。

これは私が受け取っているxmlの例です:

<properties>
    <property>
        <name>DISMISS_SETTING</name>
        <value>DEFAULT</value>
    </property>
    <property>
        <name>SHOW_SETTING</name>
        <value>DEFAULT</value>
    </property>
    <property>
        <name>DEFAULT_SETTING</name>
        <value>DEFAULT</value>
    </property>
</properties>

したがって、最初のプロパティ要素を見ていたら、値 DEFAULT をデータベースの DIMISS_SETTING 列に割り当てます。また、値の順序と組み合わせが特定の順序ではないことに注意することも重要です。

4

4 に答える 4

10

value() メソッド (xml データ型)を使用して、XML から値を抽出します。XQuery 式の述部に必要な名前を確認します。

select 
  @XML.value('(/properties/property[name = "DISMISS_SETTING"]/value/text())[1]', 'nvarchar(100)') as DISMISS_SETTING,
  @XML.value('(/properties/property[name = "SHOW_SETTING"]/value/text())[1]', 'nvarchar(100)') as SHOW_SETTING,
  @XML.value('(/properties/property[name = "DEFAULT_SETTING"]/value/text())[1]', 'nvarchar(100)') as DEFAULT_SETTING

SQL フィドル

于 2013-06-28T06:28:23.993 に答える
1

これを行うには、xml から名前と値を抽出し、名前を中心にピボットします。ただし、クエリ時に見つかった任意の名前でこれを行うことはできません。それが必要な場合は、PIVOT を削除して、内部クエリによって提供される名前と値の列のみを使用することをお勧めします。

DECLARE @xml xml

SET @xml = N'<properties>
    <property>
        <name>DISMISS_SETTING</name>
        <value>DEFAULT</value>
    </property>
    <property>
        <name>SHOW_SETTING</name>
        <value>DEFAULT</value>
    </property>
    <property>
        <name>DEFAULT_SETTING</name>
        <value>DEFAULT</value>
    </property>
</properties>'

SELECT     [DISMISS_SETTING], [SHOW_SETTING], [DEFAULT_SETTING]
FROM       (
                SELECT     properties.property.value(N'./name[1]', N'nvarchar(MAX)') AS propertyName
                         , properties.property.value(N'./value[1]', N'nvarchar(MAX)') AS propertyValue
                FROM       @xml.nodes(N'/properties/property') AS properties(property)
           ) AS properties
           PIVOT (MIN(propertyValue) FOR propertyName IN ([DISMISS_SETTING], [SHOW_SETTING], [DEFAULT_SETTING])) AS settings
于 2013-06-27T21:13:33.450 に答える