“srv_paramset中的错误。”执行sp_OAGetProperty时

时间:2015-04-30 09:17:00

标签: sql-server xml

我正在尝试获取type节点的节点值。它必须返回string“my_type”,但返回一个空字符串。

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 个答案:

答案 0 :(得分:6)

可能的替代方案:

如果您能够使用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 Server的OLE自动化。但是一些研究表明sp_OAGetPropertyVARCHAR(MAX)数据类型不兼容,因为它与输出变量不兼​​容。将输出变量数据类型 - 此情况下的@CHILDNODE_nodevalue更改为固定长度VARCHAR会立即为我解决问题。无需更改原始查询。

对于此特定任务,您还可以使用MSXML的EXECUTE sp_代替SelectSingleNode()来保存多条getElementsByTagName()行:

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)