如何不显示XMLNAMESPACES别名

时间:2017-10-15 07:02:12

标签: sql-server xml xpath soap namespaces

我理解XMLNAMESPACES子句的主要目的是声明命名空间并进一步使用它。

我有以下代码

DECLARE @XMLFINAL VARCHAR(MAX)
SET @XMLFINAL=''
DECLARE @NUMBER NVARCHAR(100)
DECLARE @XML VARCHAR(MAX)

DECLARE Records CURSOR FAST_FORWARD FOR

SELECT TOP 1 GID FROM PurchasesDocumentsLines

OPEN Records
FETCH NEXT FROM Records INTO @NUMBER
WHILE @@FETCH_STATUS = 0 
BEGIN
SET @XML=''    


;WITH XMLNAMESPACES ('OrderedProductSection' as q17)

SELECT @XML= (

SELECT 
ProductCode as 'q17:ProductCode', OrderedQuantity 'q17:OrderedQuantity'

FROM PurchasesDocumentsLines WHERE GID=@NUMBER
FOR
XML RAW('q17:OrderedProductSection'), ELEMENTS
)

生成以下输出

<q17:OrderedProducts xmlns:q17="http://ITrack.Transmission/2011/02/25/Objects">
<q17:OrderedProductSection xmlns:q17="OrderedProductSection">
<q17:ProductCode>19A0010000</q17:ProductCode>
<q17:OrderedQuantity>2</q17:OrderedQuantity>
</q17:OrderedProductSection>
<q17:OrderedProductSection xmlns:q17="OrderedProductSection">
<q17:ProductCode>1G5Y010000</q17:ProductCode>
<q17:OrderedQuantity>3</q17:OrderedQuantity>
</q17:OrderedProductSection>
<q17:OrderedProductSection xmlns:q17="OrderedProductSection">
<q17:ProductCode>1G5Y020000</q17:ProductCode>
<q17:OrderedQuantity>4</q17:OrderedQuantity>
</q17:OrderedProductSection>
<q17:OrderedProductSection xmlns:q17="OrderedProductSection">
<q17:ProductCode>1G5Y030000</q17:ProductCode>
<q17:OrderedQuantity>5</q17:OrderedQuantity>
</q17:OrderedProductSection>
<q17:OrderedProductSection xmlns:q17="OrderedProductSection">
<q17:ProductCode>1G5Y040000</q17:ProductCode>
<q17:OrderedQuantity>6</q17:OrderedQuantity>
</q17:OrderedProductSection>
</q17:OrderedProducts>

现在,这个愚蠢的问题,希望找到一个解决方案:对<q17:OrderedProductSection xmlns:q17="OrderedProductSection">标记有什么办法,不显示xmlns:q17="OrderedProductSection"?因为,不允许使用空URI。感谢

LE

使用REPLACE函数实现它。

修改

<q17:OrderedProducts xmlns:q17="http://ITrack.Transmission/2011/02/25/Objects">
    <q17:ProductCode>19A0010000</q17:ProductCode>
    <q17:OrderedQuantity>2</q17:OrderedQuantity>
    <q17:ProductCode>1G5Y010000</q17:ProductCode>
    <q17:OrderedQuantity>3</q17:OrderedQuantity>
</q17:OrderedProducts>

1 个答案:

答案 0 :(得分:0)

永远不要在CURSOR中做到这一点!他们是坏的和邪恶的,直接来自程序性思维的地狱,是由意大利面条代码的魔鬼发明的......

FOR XML的每次单独调用都将引入命名空间。这是设计的!

使用基于集合的方法可以更快,更清洁,更好地完成:

DECLARE @table TABLE(ProductCode VARCHAR(100),OrderedQuantity INT);
INSERT INTO @table VALUES
 ('19A0010000',2)
,('1G5Y010000',3);

WITH XMLNAMESPACES('http://ITrack.Transmission/2011/02/25/Objects' AS q17)
SELECT ProductCode AS [q17:ProductCode]
      ,OrderedQuantity AS [q17:OrderedQuantity]
FROM @table AS t
FOR XML PATH('q17:OrderedProductSection'),ROOT('q17:OrderedProducts');

将返回此

<q17:OrderedProducts xmlns:q17="http://ITrack.Transmission/2011/02/25/Objects">
  <q17:OrderedProductSection>
    <q17:ProductCode>19A0010000</q17:ProductCode>
    <q17:OrderedQuantity>2</q17:OrderedQuantity>
  </q17:OrderedProductSection>
  <q17:OrderedProductSection>
    <q17:ProductCode>1G5Y010000</q17:ProductCode>
    <q17:OrderedQuantity>3</q17:OrderedQuantity>
  </q17:OrderedProductSection>
</q17:OrderedProducts>