mio scenario
Sto lavorando su un database che conterrà molti dettagli da varie stored procedure in diverse banche dati in tutto l'intero server. Le informazioni che sto tentando di raccogliere ora sono: "Che cosa produce l'SP?"Utilizzo di OPENROWSET per recuperare dinamicamente i risultati SP quando SP contiene # tabelle temporanee
Nella ricerca ho trovato che la risposta si trova in OPENROWSET. I miei test iniziali hanno avuto successo e tutto sembrava fantastico. Tuttavia, dopo averlo testato con SP live, mi sono imbattuto in uno dei problemi principali: non funziona bene con le tabelle temp (#).
Ad esempio:
Se dovessi prendere questo SP:
CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
I può facilmente inserire l'output in una temperatura (##) tabella con il seguente codice, quindi interrogare sysobjects di tempdb e produrre un elenco delle colonne e dei loro tipi di dati:
IF OBJECT_ID('tempdb.dbo.##TempOutput','U') IS NOT NULL DROP TABLE ##TempOutput
DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT *
INTO ##TempOutput
FROM OPENROWSET(''SQLNCLI'', ''Server=' +
CONVERT(VARCHAR(100), SERVERPROPERTY('MachineName')) +
';Trusted_Connection=yes;'', ''SET FMTONLY OFF exec ' +
DB_NAME() +
'.dbo.zzTempSP @A=1, @B=2'')'
EXEC(@sql)
SELECT *
FROM ##TempOutput
Grande! Tuttavia, se il SP è stato questo, invece:
CREATE PROCEDURE dbo.zzTempSP (@A INT, @B INT) AS CREATE TABLE dbo.#T (A INT, B INT)
INSERT INTO dbo.#T
SELECT @A AS A, @B AS B
SELECT *
FROM dbo.#T
Quando eseguo lo stesso codice OPENROWSET
come prima ricevo il seguente errore:
Cannot process the object "SET FMTONLY OFF exec DatabaseName.dbo.zzTempSP @A=1,@B=2". The OLE DB provider "SQLNCLI10" for linked server "(null)" indicates that either the object has no columns or the current user does not have permissions on that object.
Quando ho rintuzzare il codice OPENROWSET (rimuovendo la dinamica roba) a questo:
SELECT *
FROM OPENROWSET('SQLNCLI','Server=ServerName;Trusted_Connection=yes;',
'exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
ricevo il seguente (molto più utile) di errore:
Invalid object name '#T'.
Qual è il punto in cui colpisco il muro. Nella mia ricerca sembra che non ci sia una soluzione, ma non potevo ancora arrendermi.
E così sto portato a ..
La mia domanda a voi
C'è qualcuno a conoscenza di possibili modo per aggirare questo errore? O c'è forse una soluzione alternativa?
Questo processo non verrà eseguito frequentemente, quindi non mi devo preoccupare troppo dell'efficienza della soluzione.
Qualsiasi input sarebbe molto apprezzato.
Grazie, Zok
PS: Mi dispiace per la formattazione. Non ho capito bene i tag della lingua.
Penso di aver trovato un lead che implica l'utilizzo di SET NOCOUNT ON. Quando l'ho aggiunto al mio dummy SP ha funzionato, ma non per quello che effettivamente userò (che in realtà aveva già quella linea).Continuerò a giocarci e riferirò su ciò che trovo. –
Nello stesso modo in cui ho menzionato sopra, hanno dovuto introdurre un No Op alla SP. Ho preso in considerazione la creazione di una procedura intermedia che analizzerebbe la SP che stiamo cercando di raccogliere i dettagli (attraverso i syscomments) tirando fuori la definizione della tabella temporanea per creare dinamicamente un No Op, ma vedo molti problemi che sarebbero difficili da lavorare in giro. Soooooo, sono ancora nella stessa barca. –
Un grande sforzo da parte tua .... grazie –