6

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

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

消息 7357,级别 16,状态 2,第 3 行无法处理对象“exec database.user.my_stored_proc 'AT','XXXX%','1111',1”。链接服务器“LINKSERVER”的 OLE DB 提供程序“ASEOLEDB”指示该对象没有列或当前用户对该对象没有权限。

由于 proc 在没有参数的情况下可以正常执行,我认为这不是权限问题。

4

7 回答 7

15

这对我有用,

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

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

这里有更多信息http://www.sommarskog.se/share_data.html#OPENQUERY

于 2011-08-22T00:34:27.523 回答
2

我创建了一个不返回任何值的 sp,它不起作用。您在 mysql 中的 SP 必须返回一个值!例如我在“mysql”中这样做:

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

“Id”和“Name”是输入参数,“Result”是输出参数,并在 SQL SERVER 中创建链接服务器并像这样调用它:

select * from openquery
(
    Test,'call mydb.MyPro(''Name'',''16'', @P0);'
)

它对我有用:D

于 2016-05-17T07:29:03.000 回答
1

Linked Servers 和 OPENQUERY,Gems 到 MS SQL Server...这些都是披着羊皮的狼。在处理参数时,我发现了以下解决方案

  1. 如果 SP 基本上只是 SELECT 语句,则将其移至 VIEW 并通过 OPENQUERY 传递 SQL 语句。

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

于 2010-11-11T21:49:26.087 回答
1

您还可以查看是否可以在 exec 之前使用 SET FMTONLY ON:

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

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

于 2010-11-15T02:04:52.823 回答
1

试试这个,

SELECT * FROM OPENQUERY(linked_server_name, 'SELECT postgres_procedure_name (parameters)');

于 2019-05-07T09:46:33.013 回答
0

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

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

这样做之后,我能够通过我的链接服务器连接成功运行我的存储过程。

于 2019-05-21T06:46:19.577 回答
0

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


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

Set  @SQL = 'SELECT  *  FROM OPENQUERY(' + quotename(@LinkedServer) + ',' + '''' +
 'SET FMTONLY OFF; exec [TAP].[dbo].[GetAttendanceList] '  + 'FromDate,TillDate,EmpID,CompCode,0,DeptID,DesgId,LocationID,AtnType,1'')'

您必须替换如下所示的参数值

set @SQL=REPLACE(@SQL,'FromDate',+''''+''''+@startdate+''''+'''')

  set @SQL=REPLACE(@SQL,'TillDate',+''''+''''+@enddate+''''+'''')

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

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

 if @EmpID is Null
  begin
   set @SQL=REPLACE(@SQL,'EmpID','null')
  end

  if @DeptID is Null
  begin
   set @SQL=REPLACE(@SQL,'DeptID','null')
  end

    if @DesgId is Null
  begin
   set @SQL=REPLACE(@SQL,'DesgId','null')
  end

   if @LocationID is Null
  begin
   set @SQL=REPLACE(@SQL,'LocationID','null')
  end


  print @SQL
  exec ( @SQL)
于 2019-12-29T18:50:27.573 回答