Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

L'utilizzo di OPENQUERY (procedura memorizzata exec) per creare una nuova tabella temporanea non riesce con l'errore 11526

Prova questo:

SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;

Il motivo è che quando si esegue una stored procedure su un server collegato, il provider tenta innanzitutto di determinare la forma del set di righe risultante. Lo fa emettendo SET FMTONLY ON; e poi eseguire la tua dichiarazione. In una procedura memorizzata che non utilizza tabelle temporanee, funziona magnificamente. Il parser di query esegue fondamentalmente un ciclo di prova senza effettivamente recuperare tutti i dati, solo i metadati (un po' come mostrare un piano di esecuzione stimato).

Il problema è che quando la procedura memorizzata fa utilizzare tabelle temporanee, fallisce, perché i metadati della tabella temporanea non esistono:non possono essere raccolti tramite la meta-analisi che funziona per le procedure memorizzate che non utilizzano tabelle temporanee. La cura, quindi, è SET FMTONLY OFF; manualmente all'interno del batch che sta eseguendo la procedura memorizzata.

Tieni presente che l'utilizzo di questo metodo renderà la stored procedure eseguita due volte . La prima volta per raccogliere i metadati (i dati vengono scartati) e la seconda per restituire effettivamente i dati. Se la procedura memorizzata richiamata è particolarmente costosa o presenta effetti collaterali, potrebbe essere necessario prevedere delle indennità.

Infine, nota che questo trucco non funziona su tutte le procedure memorizzate. Ci sono cose che le stored procedure possono fare che semplicemente lanciano una chiave inglese nelle opere. Non conosco tutte le possibilità, ma una di queste restituisce più recordset.

In risposta al tuo aggiornamento che SET FMTONLY OFF non funziona:puoi eventualmente ristrutturare il tuo SP per non utilizzare una tabella temporanea o per utilizzare una tabella permanente con chiave di sessione? Ognuna di queste opzioni potrebbe fare il lavoro. In SQL Server 2012, hai anche la possibilità di trasferire i dati con table- parametri di valore .

Potresti leggere Come condividere i dati tra le procedure archiviate di Erland Sommarskog. in quanto potrebbe fornirti ispirazione per un modo per raggiungere il tuo scopo.