sp_xml_preparedocument无法在openquery语句中返回? (无法确定元数据)

时间:2015-09-15 12:04:27

标签: sql sql-server stored-procedures

需要在开放查询中调用Sp。

示例Sp

CREATE PROCEDURE testsp
AS
DECLARE @idoc int,@doc varchar(1000)=
    '<OutLookContact>
         <Contact FirstName="Asif" LastName="Ghafoor" EmailAddress1="asifghafoor@my.web.pk" />
         <Contact FirstName="Rameez" LastName="Ali" EmailAddress1="rameezali@my.web.pk" />
     </OutLookContact>'

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT * 
FROM OPENXML (@idoc, '/OutLookContact/Contact',1)
WITH 
(
    FirstName varchar(50),
    LastName varchar(50),
    EmailAddress1 varchar(50)
)

现在执行

SELECT * FROM OPENQUERY ( linkserver,'Exec testsp' )

但它返回错误

  

错误消息:消息11529,级别16,状态1,过程   sp_describe_first_result_set,第1行元数据不可能   确定因为每个代码路径都会导致错误;见前一个   其中一些错误。 Msg 2812,Level 16,State 62,Procedure   第1行的sp_describe_first_result_set无法找到存储过程   &#39; TESTSP&#39;

1 个答案:

答案 0 :(得分:1)

  1. 您必须在exec

    中指定数据库名称和架构名称
    SELECT * FROM OPENQUERY ( linkserver,'Exec [Database].dbo.testsp' )
    

    但是你会收到一个错误:

  2.   

    Msg 11520,Level 16,State 1,Procedure sp_describe_first_result_set,   第1行无法确定元数据,因为语句'EXEC   过程'testsp'中的sp_xml_preparedocument @idoc OUTPUT,@ doc'   调用扩展存储过程。

    1. 您需要一个workaround - 将SP包装到新SP,结果集为:

      ALTER PROCEDURE testsp2
      AS
      
      EXEC testsp
      WITH RESULT SETS
      (
          (
              FirstName nvarchar(max),
              LastName nvarchar(max),
              EmailAddress1  nvarchar(max)
          )
      );
      

      并称之为:

      SELECT * FROM OPENQUERY ( linkserver,'Exec [Database].dbo.testsp2' 
      

      或以这种方式修改您的第一个SP。