T-SQL:使用命名空间

时间:2015-05-12 11:26:16

标签: xml tsql

之前我在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> 我猜这个问题是分号&#34;计算:场景&#34;和&#34; xmlns:计算&#34; 到目前为止,通过Google搜索,这是一个名称空间&#39;。

但是,在我发现使用命名空间查询xml的所有示例中,源xml具有如下属性:xmlns:ns =&#34; uri&#34;

然后他们在查询中使用它:&#34 ;; WITH XMLNAMESPACES(&#39; uri&#39; as ns)&#34;

我的xml没有此ns属性。

有人可以给我任何关于从哪里开始的指示,或者包含我的场景的一些基本教程吗?

非常感谢

1 个答案:

答案 0 :(得分:2)

在命名空间中选择元素或属性的一个示例:

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'

输出:

enter image description here

基本上,您需要声明名称空间前缀(calc)到名称空间URI(http://www.sap.com/ndb/BiModelCalculation.ecore)的映射,然后在XQuery语句((calc:scenario/@id)[1])中正确使用声明的前缀。所有提到的步骤都在上面的例子中进行了演示。

供参考: