2016-02-26 33 views
1

我有一個XML列,它不是用命名空間生成的,意味着沒有xmlns屬性。不幸的是,我無法解決實際的問題,這意味着創建XML的位置。如何添加或更改SQL Server中的Xml名稱空間/不能在名稱表達式中使用'xmlns'

例如:

<root>Our Content</root> 

之前它返回到一個特定的客戶端需要一個命名空間可以修改XML數據。我要的很簡單:

<root xmlns="http://OurNamespace">Our Content</root> 

我想是這樣的:

.modify('insert attribute xmlns {"ournamespace"}... 

但是,隨着

不能在名稱表達式中使用 '的xmlns' 的錯誤。

我的問題是:

  1. 是否有解決此特定錯誤的技術?
  2. 有沒有其他的或更好的方法來添加/更改SQL XML類型的名稱空間?

這是在SQL Server 2012存儲過程中。

+0

請您補充一下XML的例子,它是如何變化的以及您想要改變的(=期望的輸出)。 – Shnugo

+0

已添加示例。 –

回答

2

也許這麼簡單?

DECLARE @xml XML='<root>Our Content</root>'; 

SELECT CAST(REPLACE(CAST(@xml AS NVARCHAR(MAX)),'<root>','<root xmlns="http://OurNamespace">') AS XML) 
+0

我將此標記爲答案,因爲它確實有效。但是,它需要另一個可以從UPDATE中調用的存儲過程,因爲我正在處理一個結果集。所以,我終於在客戶端上打了一遍並糾正了它。不理想,但它是一個更簡單的實施。感謝大家的意見。 –

1

我能想出,選擇根的子節點,並把它<root xmlns="http://OurNameSpace">...</root>之間的最佳替代品。

DECLARE @t TABLE(e XML); 
INSERT INTO @t(e)VALUES('<root><el1>Our Content</el1></root>'); 
INSERT INTO @t(e)VALUES('<root><el2>Our Content</el2></root>'); 
SELECT 
    '<root xmlns="http://OurNameSpace">'+ 
    CAST(e.query('/root/*') AS NVARCHAR(MAX))+ 
    '</root>' 
FROM @t; 

最近我使用XQuery得到是這樣的:

SELECT e.query('<root xmlns="http://OurNameSpace">{*:root/*}</root>') 
FROM @t; 

但是,選擇第一個子元素(如<el1>)與xmlns=""<el1 xmlns="">)。我沒有找到解決這個問題的方法。但是,這對你來說可能夠好嗎?

+1

我不認爲**空的默認命名空間**工作...我嘗試了類似的東西,也添加了內部元素,也採取'.query('/ root/*')',對「正確」結果,將所有東西打包在「SELECT FOR XML PATH」中,並使用WITH XMLNAMESPACES來設置默認名稱空間。我也得到了'xmlns ='「'......我認爲這實際上是一個錯誤......字符串操作沒有機會...... – Shnugo

+0

@Shnugo是的,我也覺得它太傻......我嘗試了所有可能的排列想想,沒有任何工作。我設法使用'modify'來插入屬性,但只能通過改變源,而不是在select語句中。 –

+0

@Shnugo hmf屬性錯了,修改後不會帶xmlns。我吃飽了。 –

0

,而我仍然在這方面的工作,我使用

insert attribute xmlns {"http://www.ms.com"} into (/root)[1] 

將拋出

不能在計算屬性 構造函數的名稱表達式中使用「的xmlns」的錯誤。因爲在下面可能實現從Microsoft Forum: SQL XML Namespace Issue提示的情況下 Adding-xmlns-to-root-element

來概括它,的xmlns不應該改變在現有的XML結構:

原因是這篇文章中描述所有現有的子元素也必須更改

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="uri"> 
    <ns1:ProductID>316</ns1:ProductID> 
    <ns1:Name>Blade</ns1:Name> 
    <ns1:Color xsi:nil="true" /> 
    </row> 
相關問題