2017-10-15 69 views
0

我明白XMLNAMESPACES子句的主要目的是声明命名空间并进一步使用它。如何不显示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 [email protected] 
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> 

回答

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

有什么办法避免'root',使代码看起来像我的编辑?谢谢 – cdrrrrr

+0

@cdrrrrr哪里有? – Shnugo

+1

@cdrrrrr如果你确实需要它,那很容易(但我不会建议这个结构!)。只需将最后一行代码替换为FOR XML PATH(''),ROOT('q17:OrderedProducts');'。空的'PATH('')'将返回,没有行包装节点 – Shnugo