[英]Execute stored proc with OPENQUERY
我有一个带有链接的 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 可以在没有参数的情况下正常执行,因此我认为这不是权限问题。
这对我有用,
SELECT * FROM OPENQUERY(LOCALSERVER, 'SET FMTONLY OFF EXEC snr.dbo.GetAllSignals @controlRunId = 25, @experimentRunId = 26')
我正在创建临时表,这就是我拒绝访问的原因
我创建了一个不返回任何值的 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
链接服务器和 OPENQUERY、宝石到 MS SQL Server……那是披着羊皮的狼。 我发现以下解决方案在处理参数时有效
如果 SP 基本上只是 SELECT 语句,则将其移至 VIEW 并仅通过 OPENQUERY 传递 SQL 语句。
将 OPENQUERY 构建为字符串,然后使用 execute_sql。
您还可以查看在 exec 之前使用 SET FMTONLY ON 是否有效:
OPENQUERY([LINKSERVER],'SET FMTONLY ON; exec database.user.my_stored_proc ''AT'',''XXXX%'',''1111'',1')
如果你尝试这个并且它有效,你可能应该谷歌 FMTONLY+OPENQUERY 来了解它的含义。
尝试这个,
SELECT * FROM OPENQUERY(linked_server_name, 'SELECT postgres_procedure_name (parameters)');
我遇到了一个非常相似的问题,但我的 SP 没有接受任何参数。 我尝试尝试更改通过 openquery 发送的查询以包含“SET NOCOUNT ON”和“SET FMTONLY OFF”,但这没有区别。
适用于我的存储过程的唯一解决方案是删除现有版本,并将代码更改为专门的“SET NOCOUNT ON”
这样做后,我能够通过我的链接服务器连接成功运行我的存储过程。
首先,您必须添加硬编码文本字段,然后您必须将其替换为您的参数值,例如 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.