T-SQL:使用命名空间查询 xml
Posted
技术标签:
【中文标题】T-SQL:使用命名空间查询 xml【英文标题】:T-SQL: query xml with namespace 【发布时间】:2015-05-12 11:26:16 【问题描述】:我之前在 T-SQL 中做过一些基本的 xml 工作,但实际上是“基本的”。
现在遇到一些更复杂的 xml,我完全不知道从哪里开始。
<?xml version="1.0" encoding="UTF-8"?>
<Calculation:scenario xmlns:Calculation="http://www.sap.com/ndb/BiModelCalculation.ecore" schemaVersion="2.3" id="ADR2" applyPrivilegeType="ANALYTIC_PRIVILEGE" checkAnalyticPrivileges="true" defaultClient="$$client$$" defaultLanguage="$$language$$" visibility="internal" calculationScenarioType="TREE_BASED" dataCategory="DIMENSION" enforceSqlExecution="false" executionSemantic="UNDEFINED" outputViewType="Projection">
<origin/>
<descriptions defaultDescription="ADR2"/>
<metadata activatedAt="2015-04-22 16:13:29.0" changedAt="2015-04-22 21:12:59.193"/>
<localVariables/>
<variableMappings/>
<dataSources>
<DataSource id="ADR2" ....
我所有的尝试都只是带回<blank>
我猜问题是分号“Calculation:scenario”和“xmlns:Calculation”
从到目前为止的谷歌搜索来看,这是一个“命名空间”。
但是,在我发现的所有使用命名空间查询 xml 的示例中,源 xml 都有一个属性,例如:xmlns:ns="uri"
然后他们在查询中使用它:“;WITH XMLNAMESPACES ('uri' as ns)”
我的 xml 没有这个 ns 属性。
谁能给我任何关于从哪里开始的指示,或者一些包含我的场景的基本教程?
非常感谢
【问题讨论】:
【参考方案1】:在命名空间中选择元素或属性的一个示例:
declare @xml XML = '<?xml version="1.0" encoding="UTF-8"?>
<Calculation:scenario xmlns:Calculation="http://www.sap.com/ndb/BiModelCalculation.ecore" schemaVersion="2.3" id="ADR2" applyPrivilegeType="ANALYTIC_PRIVILEGE" checkAnalyticPrivileges="true" defaultClient="$$client$$" defaultLanguage="$$language$$" visibility="internal" calculationScenarioType="TREE_BASED" dataCategory="DIMENSION" enforceSqlExecution="false" executionSemantic="UNDEFINED" outputViewType="Projection">
<origin/>
<descriptions defaultDescription="ADR2"/>
<metadata activatedAt="2015-04-22 16:13:29.0" changedAt="2015-04-22 21:12:59.193"/>
<localVariables/>
<variableMappings/>
</Calculation:scenario>'
select @xml.value('declare namespace calc="http://www.sap.com/ndb/BiModelCalculation.ecore";
(calc:scenario/@id)[1]', 'varchar(max)') as 'scenario_id'
输出:
基本上,您需要声明命名空间前缀 (calc
) 到命名空间 URI (http://www.sap.com/ndb/BiModelCalculation.ecore
) 的映射,然后在 XQuery 语句 ((calc:scenario/@id)[1]
) 中正确使用声明的前缀。所有提到的步骤都在上面的示例中进行了演示。
供参考:
MSDN: XML.value()
MSDN: XML.nodes()
【讨论】:
@SimonB 不要忘记accept 答案。或者,也许您有特定的理由让问题像这样悬而未决?以上是关于T-SQL:使用命名空间查询 xml的主要内容,如果未能解决你的问题,请参考以下文章