我有一个带有链接的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将在没有参数的情况下执行得很好,我认为这不是一个权限问题。
答案 0 :(得分:14)
这对我有用,
SELECT * FROM OPENQUERY(LOCALSERVER, 'SET FMTONLY OFF EXEC snr.dbo.GetAllSignals @controlRunId = 25, @experimentRunId = 26')
我正在创建临时表,这就是我拒绝访问的原因
答案 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 ......这些都是绵羊服装中的狼。我在处理参数
时发现了以下解决方案如果SP基本上只是SELECT语句,则将其移动到VIEW并通过OPENQUERY传递SQL语句。
将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)