2010-11-11 30 views
5

Tengo SQL Server 2008 con un servidor Sybase vinculado y estoy intentando ejecutar un procedimiento almacenado en el servidor Sybase usando OPENQUERY. Si tengo un proceso almacenado que no toma parámetros, funciona bien. Si tengo un proceso almacenado con parámetros, falla. Incluso probé un proceso almacenado muy básico que solo tomó un int y que aún falló. A continuación se muestra la sintaxis que estoy utilizando:Ejecutar el proceso almacenado con OPENQUERY

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

Msg 7357, nivel 16, estado 2, línea 3 No se puede procesar el objeto "database.user.my_stored_proc exec 'AT', 'XXXX%', '1111' , 1 ". El proveedor OLE DB "ASEOLEDB" para el servidor vinculado "LINKSERVER" indica que el objeto no tiene columnas o que el usuario actual no tiene permisos sobre ese objeto.

Como el proceso se ejecutará perfectamente sin parámetros, no creo que sea un problema de permiso.

+0

¿trató de ejecutar el texto SQL directamente en Sybase? – Andomar

+0

Sí se ejecuta muy bien en Sybase –

Respuesta

1

Servidores enlazados y OPENQUERY, Gems a MS SQL Server ... que son lobos en la ropa de oveja. He encontrado las siguientes soluciones para trabajar cuando se trata de parámetros

  1. Si el SP es básicamente declaraciones que acaban de seleccionar, el traslado de la misma a una vista y sólo tiene que pasar a través de sentencias SQL OPENQUERY.

  2. Crea OPENQUERY como una cadena y luego ejecuta execute_sql.

1

También puede ver si funciona para preceder ejecutivo con SET FMTONLY EN:

OPENQUERY ([linkserver], 'SET EN FMTONLY; database.user.my_stored_proc exec '' A' '' 'XXXX%' ',' '1111' ', 1')

Si prueba esto y funciona, probablemente debería buscar en Google FMTONLY + OPENQUERY para tener una idea de lo que significa.

+1

No, esto no funcionó –

12

Esto funcionó para mí,

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

estaba creando tablas temporales, y por eso me dieron acceso denegado

Aquí hay más información http://www.sommarskog.se/share_data.html#OPENQUERY

+0

+1 esto funcionó para mí también. ¡Gracias! No estaba usando tablas temporales, pero estaba haciendo un EXEC (@VariableWithQuery) en el proceso remoto donde esa variable se configuró a partir de una instrucción SELECT. Eso no funcionó hasta que agregué "SET FMTONLY OFF"; Al Principio. Sin embargo, si configuro la variable a través de un comando SET, entonces funcionó sin necesidad de SET FMTONLY. Impar. –

+0

¡Gracias!¡¡¡Esto funcionó para mí también!!! :) – Erick

+0

advertencia justa de que hay algunas consecuencias potencialmente no deseadas para este método, como se explica en esta respuesta: https://stackoverflow.com/a/14299989; pero, es la forma más fácil de "hacer que funcione" y evitar lidiar con DTC, que probablemente sea peor, por lo que esto ("SET FMTONLY OFF") es una solución alternativa. – NateJ

2

creo un SP que no lo hace devuelve cualquier valor y no funciona. ¡Su SP en mysql tiene que devolver un valor! por ejemplo, hago esto en "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 

Ese "ID" y "Nombre" es el parámetro de entrada y "Resultado" es el parámetro de salida y crear servidor vinculado en SQL Server y lo llaman así:

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

funciona para mí: D

Cuestiones relacionadas