Méthode T-SQL xquery .modify à l'aide d'un caractère générique

Je travaille dans SQL Server 2014. J'ai créé une procédure stockée qui fait son traitement, et à la fin, prend la sortie de la requête finale et le met en format XML. En raison de la nature de la logique dans la procédure, un noeud doit parfois être supprimé de la sortie XML finale. Voici un exemple de la sortie XML (par souci de brièveté, je n'ai pas inclus les nœuds racine, j'espère qu'ils ne seront pas nécessaires pour répondre à ma question):

<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> 

Dans la procédure, j'ai un code qui regarde la structure XML ci-dessus et supprime un nœud quand il ne devrait pas être là parce qu'il est plus facile de modifier le xml que modifier la sortie de la requête. Voici un exemple de ce code:

 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*"]'); 

La dernière command est celle que je n'arrive pas à comprendre. Tout ce que je dois faire est de searchr des instances où l'élément "DrugConceptType" commence par la string "RxNorm", car il existe plusieurs versions de la string qui peuvent éventuellement se produire.

J'ai longuement étudié Googled et StackOverFlowed, mais peut-être à cause de mon inexpérience dans ce domaine, je n'ai pas posé la question correctement.

Existe-t-il un moyen relativement simple de réécrire l'instruction finale .modify ci-dessus pour utiliser un caractère générique après "RxNorm"?

Votre réduction du nœud racine est un problème acutally, comme vous utilisez l'espace de noms "ccxsd" et votre XML ne montre pas cela.

Quoi qu'il en soit, mieux que d'écrire l' declare namespace ... encore et encore, était-ce en tant que première ligne de votre déclaration:

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

Eh bien, comme un .modify() est un appel d' une seule déclaration, il ne fait pas une telle différence …

Mais à votre question d'un caractère générique

Cela supprimerait tous les nœuds, où le contenu de l'élément commence par "RxNorm":

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

Soyez conscient des namespaces manquants … Impossible de le tester …

EDIT: Un exemple de travail simplifié:

Vous devez vérifier cela avec votre XML actuel (avec la racine et l'espace de noms)

 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:subssortingng((../../ScreenDrug/DrugConceptType)[1],1,6)="RxNorm"]'); SELECT @xml_Out;