我正在尝试获取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
的输出:
答案 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_OAGetProperty
与VARCHAR(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)