Sql server &引用;srv_参数集出错。”;在执行sp_OageProperty时

Sql server &引用;srv_参数集出错。”;在执行sp_OageProperty时,sql-server,xml,Sql Server,Xml,我正在尝试获取类型节点的节点值。它必须返回字符串“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 = '&

我正在尝试获取
类型
节点的节点值。它必须返回
字符串
“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)
上述
EXEC sp_OAGetErrorInfo@node
的输出:


可能的替代方案:

如果您可以使用
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

您不能直接使用吗?谢谢您的解决方案,但所有项目都使用OLE对象for XML,如果我实现您的解决方案,几乎所有代码都将被重写。我的例子是项目的一小部分,它是从不同的角度收集的procedures@WalentynaJuszkiewicz您可以始终使用
sp_OAGetErrorInfo
检查上一个OLE自动化过程执行的状态,以便进行调试HAR07,非常感谢您的回答!这真的很有帮助。我已经将varchar(max)更改为varchar(8000),现在可以使用了!伟大的谢谢大家!@WalentynaJuszkiewicz我试图用谷歌搜索错误消息,但找不到任何相关信息。因此,我认为这是记录解决方案的正确位置。希望你不介意我对这个问题的修改!也感谢您确认它也适用于您!嗯。。刚刚发现一些链接说,已知限制为8000字节(
varchar(8000)
),所以。。至少在StackOverlow中没有相关内容:p
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
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)