【问题标题】:SELECT * FROM OPENXML IN STORED PROCEDURE returns empty rowSELECT * FROM OPENXML IN STORED PROCEDURE 返回空行
【发布时间】:2015-10-03 18:11:03
【问题描述】:

我在存储过程中使用 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'
    )

【问题讨论】:

  • 我知道这只是一个简单的例子,但是当你准备好代码生产时不要忘记调用sp_xml_removedocument来释放文档句柄,否则这会导致资源泄漏

标签: stored-procedures sql-server-2008-r2 sql-server-openxml


【解决方案1】:

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

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

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

【讨论】:

  • 它有效!但是我可以通过使用 openrowset 调用 xml 在我的商店过程中像这样使用它吗?这是打算如何使用它,但到目前为止它不起作用。你可以试试看这个吗?谢谢特德。 --- 从行集中选择 INSERT INTO tblEmp --(name,designation) SELECT * FROM OPENXML(@HANDLE, '/Dataset/tblEmp') WITH (name VARCHAR(50) 'name',designation VARCHAR(50) 'designation ')
  • 您仍然拥有Dataset 而不是DataSet
  • @MuhammadNazri 是的 openxml 可以在存储过程中使用。我的典型用例是以 XML 格式将一批更改推送到 SP,然后 proc 可以执行该数据集之外的任何业务逻辑。
  • 谢谢@RafałWojtaszek,这是一个救生员。并感谢 Ted,分享技巧。所以我会把这个标记为答案。
【解决方案2】:

将您的查询更改为:

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

【讨论】:

  • 谢谢兄弟?但是一个问题,但是我如何将它与 openrowset 一起使用?我的意思是,我想从磁盘调用 xml 文件,用 openxml 打开它,然后将它插入到表中。我可以这样用吗? INSERT INTO tblEmp --(name,designation) SELECT * FROM OPENXML(@HANDLE, '/Dataset/tblEmp') WITH (name VARCHAR(50) 'name',designation VARCHAR(50) 'designation')
  • 我把它改成存储过程。我希望这是你所需要的。
猜你喜欢
  • 2022-12-02
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多