1

我在存储过程中使用 openxml 函数时遇到问题,如您所见,select 语句返回空行。我怀疑 sql 无法读取 xml 目录。这是我第一次使用此功能,所以我不确定这是使用它的正确方法。顺便说一句,我使用的是 sql server 2008 r2。这是重现问题的代码。

Declare @hddoc int
Declare @Doc xml 

SET @Doc = ' <DataSet>
     <tblEmp>
      <name>Nazri</name> 
      <designation>Developer</designation>  
    </tblEmp>
    <tblEmp>
      <name>Jibin</name> 
 <designation>System Analyst</designation> 
   </tblEmp>
          </DataSet>'

EXEC SP_XML_PREPAREDOCUMENT @hddoc OUTPUT, @Doc

SELECT @hddoc

DECLARE @iDoc INT
SET @iDoc = 1

SELECT *
FROM OPENXML(@iDoc,'/Dataset/tblEmp')
   WITH ( name varchar(50) '@name',
   designation varchar(50) '@designation'
    )
4

2 回答 2

1

问题是提供的表映射表明值应该是属性;但是,在 XML 中它们是元素。将您的语句更改OPENXML为如下所示,它应该返回预期的结果。

SELECT * FROM OPENXML(@iDoc,'/DataSet/tblEmp',2)
   WITH ( name varchar(50) 'name',
   designation varchar(50) 'designation'
    )

基本上,这两个更改是指定以元素为中心的映射和更新相对 xpath 以查找元素而不是属性。

于 2015-10-03T18:19:20.197 回答
0

将您的查询更改为:

CREATE PROCEDURE AddData
( @data XML)
AS
BEGIN
DECLARE
    @handle INT,
    @PrepareXmlStatus INT

EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @Data

INSERT INTO tblEmp (name,designation)
SELECT *
FROM OPENXML(@handle,'/DataSet/tblEmp',2)
   WITH ( name varchar(50) 'name',
          designation varchar(50) 'designation')

EXEC sp_xml_removedocument @handle

END
于 2015-10-03T18:37:04.977 回答