Mon scénario
Je travaille sur une base de données qui contiendra de nombreux détails de diverses procédures stockées dans différentes bases de données sur l'ensemble du serveur. L'information que je tente de rassembler maintenant est: «Que sort le SP?En utilisant OPENROWSET pour récupérer dynamiquement les résultats de la SP lorsque SP contient des tables temporaires n
En cherchant, j'ai trouvé que la réponse se trouve dans OPENROWSET. Mes tests initiaux ont été réussis et tout semblait bien. Cependant, après l'avoir testé avec des SPs actifs, j'ai rencontré un problème majeur: il ne fonctionne pas bien avec les tables temp (#).
Par exemple:
Si je devais prendre ce SP:
CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
je peux facilement insérer la sortie dans une température (##) table avec le code suivant, puis interroger les sysobjects de tempdb et produire une liste des colonnes et de leurs types de données:
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
Great! Cependant, si le SP était plutôt:
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
Lorsque j'exécute le même code OPENROWSET
comme avant que je reçois l'erreur suivante:
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.
Quand je couperons le code OPENROWSET (en supprimant la dynamique choses) à ceci:
SELECT *
FROM OPENROWSET('SQLNCLI','Server=ServerName;Trusted_Connection=yes;',
'exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
Je reçois l'erreur suivante (beaucoup plus utile):
Invalid object name '#T'.
C'est où je frappe le mur. Dans mes recherches, il semble qu'il n'y ait pas de solution, mais je ne pouvais pas me résoudre à abandonner tout de suite.
Et donc je suis conduit à ..
Ma question
Quelqu'un est-il au courant de toute façon possible de contourner cette erreur? Ou y a-t-il éventuellement une solution alternative?
Ce processus ne sera pas exécuté fréquemment, donc je n'ai pas besoin de trop m'inquiéter de l'efficacité de la solution.
Toute contribution serait grandement appréciée.
Merci, Zok
PS: Désolé pour la mise en forme. Je n'ai pas bien compris les étiquettes de langue.
Je pense que j'ai peut-être trouvé une piste qui implique l'utilisation de SET NOCOUNT ON. Lorsque je l'ai ajouté à mon SP factice, cela a fonctionné, mais pas pour celui que j'utiliserai réellement (qui avait déjà cette ligne).Je vais continuer à jouer avec et faire un rapport sur ce que je trouve. –
Dans la même avance que j'ai mentionné ci-dessus, ils ont dû introduire un No Op à la SP. J'ai envisagé de créer une procédure intermédiaire qui analyserait le SP dont nous essayons de rassembler les détails (par le biais de syscomments) en extrayant la définition de la table temporaire pour créer dynamiquement un No Op, mais je vois beaucoup de problèmes qui seraient difficiles à travailler autour. Soooooo, je suis toujours dans le même bateau. –
Super effort mis en place par vous .... merci –