我试图获取节点的节点值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以上产出:

可能的选择:
如果您能负担得起使用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)
| 归档时间: |
|
| 查看次数: |
1410 次 |
| 最近记录: |