1

私はSQL Server 2014で作業しています。処理を行うストアドプロシージャを作成し、最後に最終的なクエリ出力を取得してXMLとしてフォーマットします。プロシージャのロジックの性質上、最終的な XML 出力からノードを削除する必要がある場合があります。XML 出力のサンプルを次に示します (簡潔にするために、ルート ノードは含めていません。私の質問に答える必要がないことを願っています)。

<DALink>
    <InteractingIngredients>
        <InteractingIngredient>
            <IngredientID>1156</IngredientID>
            <IngredientDesc>Lactobacillus acidophilus</IngredientDesc>
            <HICRoot>Lactobacillus acidophilus</HICRoot>
            <PotentiallyInactive>Not necessary</PotentiallyInactive>
            <StatusCode>Live</StatusCode>
        </InteractingIngredient>
    </InteractingIngredients>
    <ActiveProductsExistenceCode>Exist</ActiveProductsExistenceCode>
    <IngredientTypeBasisCode>1</IngredientTypeBasisCode>
    <AllergenMatch>Lactobacillus acidophilus</AllergenMatch>
    <AllergenMatchType>Ingredient</AllergenMatchType>
</DALink>
<ScreenDrug>
    <DrugID>1112894</DrugID>
    <DrugConceptType>RxNorm_SemanticClinicalDr</DrugConceptType>
    <DrugDesc>RxNorm LACTOBACILLUS ACIDOPHILUS/PECTIN ORAL capsule</DrugDesc>
    <Prospective>true</Prospective>
</ScreenDrug>

この手順では、上記の XML 構造を調べて、存在しないはずのノードを削除するコードを使用しています。これは、クエリ出力を微調整するよりも xml を変更する方が簡単だからです。そのコードのサンプルを次に示します。

SET @xml_Out.modify('declare namespace ccxsd="http://schemas.foobar.com/CC/v1_3"; delete //ccxsd:InteractingIngredients[../../../ccxsd:ScreenDrug/ccxsd:DrugConceptType="OneThing"]');
SET @xml_Out.modify('declare namespace ccxsd="http://schemas.foobar.com/CC/v1_3"; delete //ccxsd:InteractingIngredients[../../../ccxsd:ScreenDrug/ccxsd:DrugConceptType="AnotherThing"]');
SET @xml_Out.modify('declare namespace ccxsd="http://schemas.foobar.com/CC/v1_3"; delete //ccxsd:InteractingIngredients[../../../ccxsd:ScreenDrug/ccxsd:DrugConceptType="SomethingElse"]');
SET @xml_Out.modify('declare namespace ccxsd="http://schemas.foobar.com/CC/v1_3"; delete //ccxsd:InteractingIngredients[../../../ccxsd:ScreenDrug/ccxsd:DrugConceptType="SomethingElseAgain"]');
SET @xml_Out.modify('declare namespace ccxsd="http://schemas.foobar.com/CC/v1_3"; delete //ccxsd:InteractingIngredients[../../../ccxsd:ScreenDrug/ccxsd:DrugConceptType="RxNorm*"]');

最後のコマンドは、どうすればうまくいくかわかりません。要素「DrugConceptType」が文字列「RxNorm」で始まるインスタンスを探すだけで済みます。文字列には複数のバージョンが存在する可能性があるためです。

私はグーグルで調べて StackOverFlowed しましたが、おそらくこの分野での経験が浅かったために、正しく質問できませんでした。

「RxNorm」の後にワイルドカードを使用するために、上記の最後の .modify ステートメントを書き直す比較的簡単な方法はありますか?

4

1 に答える 1

1

名前空間「 ccxsd 」を使用していて、XML がこれを示していないため、ルート ノードの削減は実際には問題です。

とにかく、何度も何度も書くよりも、declare namespace ...これがあなたの声明の最初の行でした:

;WITH XMLNAMESPACES('http://schemas.fdbhealth.com/CC/v1_3' AS ccxsd)

まあ、 a.modify()1つのステートメント呼び出しなので、それほど違いはありません...

しかし、ワイルドカードの質問には

これにより、要素のコンテンツが「RxNorm」で始まるすべてのノードが削除されます。

SET @xml.modify('delete //*[fn:substring(.,1,6)="RxNorm"]');

欠落している名前空間に注意してください...テストできません...

編集:単純化された作業例:

実際の XML (ルートと名前空間を使用) でこれを確認する必要があります。

DECLARE @xml_Out XML=
'<DALink>
    <InteractingIngredients>
        <InteractingIngredient>
            <IngredientID>1156</IngredientID>
            <IngredientDesc>Lactobacillus acidophilus</IngredientDesc>
            <HICRoot>Lactobacillus acidophilus</HICRoot>
            <PotentiallyInactive>Not necessary</PotentiallyInactive>
            <StatusCode>Live</StatusCode>
        </InteractingIngredient>
    </InteractingIngredients>
    <ActiveProductsExistenceCode>Exist</ActiveProductsExistenceCode>
    <IngredientTypeBasisCode>1</IngredientTypeBasisCode>
    <AllergenMatch>Lactobacillus acidophilus</AllergenMatch>
    <AllergenMatchType>Ingredient</AllergenMatchType>
</DALink>
<ScreenDrug>
    <DrugID>1112894</DrugID>
    <DrugConceptType>RxNorm_SemanticClinicalDr</DrugConceptType>
    <DrugDesc>RxNorm LACTOBACILLUS ACIDOPHILUS/PECTIN ORAL capsule</DrugDesc>
    <Prospective>true</Prospective>
</ScreenDrug>';

SET @xml_Out.modify('delete //InteractingIngredients[fn:substring((../../ScreenDrug/DrugConceptType)[1],1,6)="RxNorm"]');

SELECT @xml_Out;
于 2016-04-27T20:57:36.047 に答える