我很难解决这个问题。我正在使用OPENQUERY
在链接服务器上执行存储过程。
我设法通过使用以下方法来做到这一点:
SELECT *
FROM OPENQUERY(
[LINKEDSRV\SQLSRV],
'SET FMTONLY OFF; SET NOCOUNT ON; EXEC [Database_Name_Example].Data.usp_GetNames 5,''S''')
GO
我使用SET FMTONLY OFF
和SET 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
到目前为止,一切都很好,直到我踩到一个使用SELECT
和UPDATE
链接服务器上的某些表的存储过程为止。当我执行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
只是选择数据。
我该怎么做才能允许权限?
谢谢!