使用OPENQUERY执行存储过程

时间:2010-11-11 21:31:10

标签: sql sql-server tsql sybase openquery

我有一个带有链接的Sybase服务器的SQL Server 2008,我正在尝试使用OPENQUERY在Sybase服务器上执行存储过程。如果我有一个不带参数的存储过程,它就会成功。如果我有一个带参数的存储过程则失败。我甚至尝试过一个非常基本的存储过程,只接受一个仍然失败的int。以下是我正在使用的语法:

select * from 
OPENQUERY([LINKSERVER],'exec database.user.my_stored_proc ''AT'',''XXXX%'',''1111'',1')

Msg 7357,Level 16,State 2,Line 3 无法处理对象“exec database.user.my_stored_proc'AT','XXXX%','1111',1”。链接服务器“LINKSERVER”的OLE DB提供程序“ASEOLEDB”表示该对象没有列,或者当前用户没有该对象的权限。

由于proc将在没有参数的情况下执行得很好,我认为这不是一个权限问题。

7 个答案:

答案 0 :(得分:14)

这对我有用,

SELECT * FROM OPENQUERY(LOCALSERVER, 'SET FMTONLY OFF EXEC snr.dbo.GetAllSignals @controlRunId = 25, @experimentRunId = 26')

我正在创建临时表,这就是我拒绝访问的原因

以下是更多信息http://www.sommarskog.se/share_data.html#OPENQUERY

答案 1 :(得分:2)

我创建了一个不会返回任何值的sp,但它不起作用。 你在mysql中的SP必须返回一个值! 例如,我在" mysql":

中这样做
[HttpListenerException (0x5): Access is denied]
System.Net.HttpListener.SetupV2Config() +333
System.Net.HttpListener.Start() +297
Google.Apis.Auth.OAuth2.<ReceiveCodeAsync>d__6.MoveNext() +188
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58

那&#34; Id&#34;和&#34;姓名&#34;是输入参数和&#34;结果&#34;是输出参数 并在SQL SERVER中创建链接服务器并将其命名为:

CREATE DEFINER=`root`@`localhost` PROCEDURE `MyPro`(IN `Name` VARCHAR(50), IN `Id` INT, OUT `Result` INT)
MODIFIES SQL DATA
BEGIN
DECLARE Result INT;
    SET Result = 0;
INSERT into MyTable (Id,Name)  VALUES(Id,Name);
SELECT Result;

END

它对我有用:D

答案 2 :(得分:1)

链接服务器和OPENQUERY,Gems到MS SQL Server ......这些都是绵羊服装中的狼。我在处理参数

时发现了以下解决方案
  1. 如果SP基本上只是SELECT语句,则将其移动到VIEW并通过OPENQUERY传递SQL语句。

  2. 将OPENQUERY构建为字符串,然后使用execute_sql。

答案 3 :(得分:1)

您还可以看到它是否适用于exec与SET FMTONLY ON:

OPENQUERY([LINKSERVER],'SET FMTONLY ON; exec database.user.my_stored_proc''AT'',''XXXX%'',''1111'',1')

如果你尝试这个并且它有效,你应该谷歌FMTONLY + OPENQUERY来了解它的含义。

答案 4 :(得分:1)

尝试一下

SELECT * FROM OPENQUERY(链接服务器名称,'SELECT postgres_procedure_name(参数)');

答案 5 :(得分:0)

我遇到了一个非常相似的问题,但是我的SP没有使用任何参数。 我尝试过尝试更改通过openquery发送的查询,以包括“ SET NOCOUNT ON”和“ SET FMTONLY OFF”,但这没有区别。

适用于我的存储过程的唯一解决方案是删除现有版本,并将代码更改为专门的“ SET NOCOUNT ON”

完成此操作后,我能够通过链接的服务器连接成功运行存储的proc。

答案 6 :(得分:0)


  

首先,您必须添加硬代码文本字段,然后   将其替换为您的参数值,例如FromDate,TillDate,EmpID,CompCode,0,DeptID,DesgId,LocationID,AtnType


DECLARE @startdate varchar(255)='2019-12-17' 宣告@enddate varchar(255)='2019-12-17'

设置@SQL ='SELECT * FROM OPENQUERY('+ quotename(@LinkedServer)+','+''''+  '关闭FMTONLY; exec [TAP]。[dbo]。[GetAttendanceList]'+'FromDate,TillDate,EmpID,CompCode,0,DeptID,DesgId,LocationID,AtnType,1'')'

您必须替换下面显示的参数值

设置@ SQL = REPLACE(@ SQL,'FromDate',+''''+''''+ @ startdate +''''+'''')

设置@ SQL = REPLACE(@ SQL,'TillDate',+''''+''''+ @ enddate +''''+'''')

设置@ SQL = REPLACE(@ SQL,'CompCode',+''''+''''+ @ CompCode +''''+'''')

set @SQL=REPLACE(@SQL,'AtnType',+''''+''''+''''+'''')

如果@EmpID为Null   开始    设置@ SQL = REPLACE(@ SQL,'EmpID','null')   结束

如果@DeptID为Null   开始    设置@ SQL = REPLACE(@ SQL,'DeptID','null')   结束

if @DesgId is Null

开始    设置@ SQL = REPLACE(@ SQL,'DesgId','null')   结束

如果@LocationID为Null   开始    设置@ SQL = REPLACE(@ SQL,'LocationID','null')   结束

打印@SQL   exec(@SQL)