我理解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>
答案 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>