如何使用OPENQUERY正确执行存储过程以更新链接的服务器表?

时间:2019-07-04 19:22:25

标签: sql-server linked-server openquery

我很难解决这个问题。我正在使用OPENQUERY在链接服务器上执行存储过程。 我设法通过使用以下方法来做到这一点:

SELECT *    
FROM   OPENQUERY(
[LINKEDSRV\SQLSRV],  
'SET FMTONLY OFF; SET NOCOUNT ON; EXEC [Database_Name_Example].Data.usp_GetNames 5,''S''')   
GO 

我使用SET FMTONLY OFFSET NOCOUNT ON的原因是,当我在没有它们的情况下尝试上面的代码时,出现了以下消息:

  

信息7357,第16级,州1,第1行   无法处理对象“ EXEC [Database_Name_Example] .Data.usp_GetNames 5,'S'”。链接服务器“ LINKEDSRV \ SQLSRV”的OLE DB提供程序“ SQLNCLI”指示该对象没有列或当前用户对该对象没有权限。

在线阅读很多内容可以帮助我找到答案。该博客例如:http://www.sommarskog.se/share_data.html#OPENQUERY

到目前为止,一切都很好,直到我踩到一个使用SELECTUPDATE链接服务器上的某些表的存储过程为止。当我执行OPENQUERY时,我从SELECT语句中得到结果,但是我注意到它不会更新表。

存储过程如下:

CREATE PROCEDURE Data.usp_GetNames (@year tinyint=NULL, @online char(1)=NULL)
if @online = 'S'    
  BEGIN
    select nam_codig, nam_desc from Names
    where nam_status = 'P'
    order by nam_date

    UPDATE Names
    SET nam_status = 'S'
    where nam_status = 'P'
END

当我直接在链接服务器中执行它时,它会更新表,因此第二次执行它时,将不再有nam_status = 'P'

但是,如果我使用OPENQUERY执行它,结果是相同的,那么它不会UPDATE只是选择数据。

我该怎么做才能允许权限?

谢谢!

0 个答案:

没有答案