Esegui stored procedure con OPENQUERY
-
08-10-2019 - |
Domanda
Ho SQL Server 2008 con un server Sybase collegato e sto cercando di eseguire una stored procedure sul server Sybase utilizzando OPENQUERY. Se ho un proc memorizzato che non prende parametri riesce bene. Se ho una stored procedure con i parametri viene a mancare. Ho anche provato un proc molto di base memorizzato che ha preso solo un int una che ancora non è riuscito. Di seguito è riportato la sintassi che sto usando:
select * from
OPENQUERY([LINKSERVER],'exec database.user.my_stored_proc ''AT'',''XXXX%'',''1111'',1')
Msg 7357, livello 16, stato 2, riga 3 Impossibile elaborare l'oggetto "exec database.user.my_stored_proc 'A', 'XXXX%', '1111', 1". Il provider OLE DB "ASEOLEDB" per "LINKSERVER" server collegato indica che sia l'oggetto non ha colonne o l'utente corrente non dispone delle autorizzazioni su quell'oggetto.
Come il proc eseguirà bene anche senza parametri, io non credo che sia un problema di autorizzazione.
Soluzione
server collegati e OPENQUERY, gemme per MS SQL Server ... che sono lupi travestiti da pecore. Ho trovato le soluzioni seguenti al lavoro quando si tratta di parametri
-
Se la SP è fondamentalmente basta selezionare le dichiarazioni, il passaggio della stessa ad una vista e basta passare istruzioni SQL tramite OPENQUERY.
-
Costruire l'OPENQUERY come una stringa e quindi utilizzare execute_sql.
Altri suggerimenti
Questo ha funzionato per me,
SELECT * FROM OPENQUERY(LOCALSERVER, 'SET FMTONLY OFF EXEC snr.dbo.GetAllSignals @controlRunId = 25, @experimentRunId = 26')
I stava creando tabelle temporanee, ed è per questo mi sono Accesso negato
Ecco ulteriori informazioni http://www.sommarskog.se/share_data.html#OPENQUERY
creo un SP che non restituisce alcun valore e non funziona. Il tuo SP in MySQL deve restituire un valore! per esempio faccio questo in "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
Questo "ID" e "Nome" è parametro di input e "Risultato" è parametro di uscita e creare server collegato in SQL Server e chiamare in questo modo:
select * from openquery
(
Test,'call mydb.MyPro(''Name'',''16'', @P0);'
)
Si lavora per me: D
Si potrebbe anche vedere se funziona precedere exec con SET FMTONLY ON:
OPENQUERY ([LINKSERVER], 'SET FMTONLY ON; database.user.my_stored_proc exec '' A'', '' XXXX% '', '' 1111 '', 1' )
Se si tenta questo e funziona, probabilmente si dovrebbe Google FMTONLY + OPENQUERY per avere un'idea di ciò che significa.
Prova questo,
SELECT * FROM OPENQUERY (linked_server_name, 'postgres_procedure_name SELECT (parametri)');
Ho sperimentato un problema molto simile, ma il mio SP non stava prendendo alcun parametro. Ho provato a sperimentare con alterare la query inviata attraverso l'openquery per includere 'SET NOCOUNT ON' e 'SET FMTONLY OFF', ma questo non ha avuto differenza.
L'unica soluzione che ha funzionato per la mia stored procedure era caduta la versione esistente, e alterando il codice per specificamente 'SET NOCOUNT ON'
Dopo aver fatto questo sono stato in grado di eseguire con successo il mio proc memorizzato tramite la mia connessione server collegato.