2015-04-30 17 views
3

我試圖獲得節點值爲type節點。它必須返回string「my_type」,但返回空字符串。「srv_paramset中的錯誤」。在執行sp_OAGetProperty

declare @v_msg int 
DECLARE @loadXML_result INT 
declare @v_line varchar(4000) 
declare @nodelist int 
DECLARE @node  INT 
DECLARE @childnode INT 
DECLARE @CHILDNODE_nodevalue VARCHAR(MAX) 

set @v_line = 
'<message> 
<type>my_type</type> 
</message>'; 

EXECUTE sp_OACreate 'MSXML2.DOMDocument.6.0',@v_msg OUTPUT 
EXECUTE sp_OAMethod @v_msg,'loadXML',@loadXML_result OUTPUT,@v_line 

EXECUTE sp_OAMethod @v_msg,'getElementsByTagName',@nodelist OUTPUT,'type' 
EXECUTE sp_OAMethod @nodelist,'Item',@node OUTPUT,0 
EXECUTE sp_OAGetProperty @node,'firstChild',@childnode OUTPUT 
print concat('child_node ',@childnode) 
EXECUTE sp_OAGetProperty @childnode,'nodeValue',@CHILDNODE_nodevalue OUTPUT 

print concat ('CHILDNODE_nodevalue ',@CHILDNODE_nodevalue) 

上的sp_OAGetProperty執行的狀態進一步檢查顯示有錯誤:

輸出的
DECLARE @hr INT 
EXECUTE @hr = sp_OAGetProperty @node,'Text',@CHILDNODE_nodevalue OUTPUT 

--Check status of the previous execution of sp_OAGetProperty 
EXEC sp_OAGetErrorInfo @node 

EXEC sp_OAGetErrorInfo @node以上:

enter image description here

+1

你就不能使用['XML'數據類型+'節點()'](HTTPS ://msdn.microsoft.com/en-us/library/ms188282.aspx)? – har07

回答

5

可能的替代:

如果你能夠用得起XML數據類型和nodes()功能,你可以試試這個方法:

declare @v_line XML, @CHILDNODE_nodevalue VARCHAR(MAX) 
set @v_line = 
'<message> 
<type>my_type</type> 
</message>'; 

select @CHILDNODE_nodevalue = x.value('text()[1]', 'varchar(max)') 
from @v_line.nodes('//type') as T(x) 

print @CHILDNODE_nodevalue 

解決方案:

至於原來的問題,我沒有真正熟悉SQL服務器的OLE自動化。但有一點研究表明,sp_OAGetProperty不知何故與VARCHAR(MAX)數據類型不兼容作爲輸出變量。更改輸出變量數據類型 - @CHILDNODE_nodevalue對於這種情況 - 以固定長度VARCHAR立即爲我解決問題。不需要對原始查詢進行更多更改。

您也可以通過使用MSXML的SelectSingleNode(),而不是getElementsByTagName()對於這個特殊的任務節省數EXECUTE sp_線:

declare @v_msg int 
DECLARE @loadXML_result INT 
declare @v_line varchar(4000) 
DECLARE @node  INT 
DECLARE @CHILDNODE_nodevalue VARCHAR(1000) 
          --^^^^^^^^^^^^^ 
          --try not to use VARCHAR(MAX) 

set @v_line = 
'<message> 
<type>my_type</type> 
</message>'; 

EXECUTE sp_OACreate 'MSXML2.DOMDocument.6.0',@v_msg OUTPUT 
EXECUTE sp_OAMethod @v_msg,'loadXML',@loadXML_result OUTPUT,@v_line 

EXECUTE sp_OAMethod @v_msg,'SelectSingleNode',@node OUTPUT,'//type' 
EXECUTE sp_OAGetProperty @node,'Text',@CHILDNODE_nodevalue OUTPUT 

print concat('CHILDNODE_nodevalue ',@CHILDNODE_nodevalue) 
+0

感謝您的解決方案,但所有項目都使用XML的OLE對象,如果我實現您的解決方案,幾乎所有代碼都將被重寫。我的例子是項目的一小部分,它是從不同的程序收集的 –

+0

@WalentynaJuszkiewicz檢查更新的答案 – har07

+0

@WalentynaJuszkiewicz您總是可以使用'sp_OAGetErrorInfo'來檢查以前的OLE自動化程序執行的狀態以進行調試 – har07