T-SQL xquery .modify 方法使用通配符
T-SQL xquery .modify method using a wildcard
我在 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" 开头的实例,因为可能会出现多个版本的字符串。
我已经用 Google 和 Whosebug 进行了详细的搜索,但也许是因为我在这方面缺乏经验,所以我没有正确地提出问题。
有没有相对简单的方法重写上面最后的 .modify 语句以在 "RxNorm" 之后使用通配符?
你的减少根节点实际上是一个问题,因为你正在使用命名空间“ccxsd”而你的XML没有显示这个。
无论如何,总比一遍又一遍地写 declare namespace ...
好,这是你声明的第一行吗:
;WITH XMLNAMESPACES('http://schemas.fdbhealth.com/CC/v1_3' AS ccxsd)
好吧,因为 .modify()
是一个 单语句调用 它并没有什么区别...
但是对于你的通配符问题
这将删除元素内容以“RxNorm”开头的所有节点:
SET @xml.modify('delete //*[fn:substring(.,1,6)="RxNorm"]');
注意缺少命名空间...无法测试...
编辑:一个简化的工作示例:
您必须使用您的实际 XML(使用 root 和命名空间)
进行检查
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;
我在 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" 开头的实例,因为可能会出现多个版本的字符串。
我已经用 Google 和 Whosebug 进行了详细的搜索,但也许是因为我在这方面缺乏经验,所以我没有正确地提出问题。
有没有相对简单的方法重写上面最后的 .modify 语句以在 "RxNorm" 之后使用通配符?
你的减少根节点实际上是一个问题,因为你正在使用命名空间“ccxsd”而你的XML没有显示这个。
无论如何,总比一遍又一遍地写 declare namespace ...
好,这是你声明的第一行吗:
;WITH XMLNAMESPACES('http://schemas.fdbhealth.com/CC/v1_3' AS ccxsd)
好吧,因为 .modify()
是一个 单语句调用 它并没有什么区别...
但是对于你的通配符问题
这将删除元素内容以“RxNorm”开头的所有节点:
SET @xml.modify('delete //*[fn:substring(.,1,6)="RxNorm"]');
注意缺少命名空间...无法测试...
编辑:一个简化的工作示例:
您必须使用您的实际 XML(使用 root 和命名空间)
进行检查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;