"srv_paramset中的错误." 执行sp_OAGetProperty时

Wal*_*icz 3 xml sql-server

我试图获取节点的节点值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)
Run Code Online (Sandbox Code Playgroud)

进一步检查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
Run Code Online (Sandbox Code Playgroud)

EXEC sp_OAGetErrorInfo @node以上产出:

在此输入图像描述

har*_*r07 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
Run Code Online (Sandbox Code Playgroud)

方案:

关于原始问题,我实际上并不熟悉SQL Server的OLE自动化.但是一些研究表明,sp_OAGetProperty某种程度上与VARCHAR(MAX)数据类型不兼容是输出变量.将输出变量数据类型(@CHILDNODE_nodevalue对于这种情况)更改为固定长度会VARCHAR立即为我解决问题.无需更改原始查询.

您还可以EXECUTE sp_使用MSXML 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)
Run Code Online (Sandbox Code Playgroud)

  • har07,非常感谢你的回答!这真的很有帮助.我已经将varchar(max)更改为varchar(8000),现在可以正常工作了!大!谢谢! (2认同)