1

Sur notre instance de production SQL2000, nous avons une base de données avec des centaines de procédures stockées, dont beaucoup utilisent une technique de création d'une table #TEMP dans le code puis diverses procédures stockées internes sont EXECUTEd par ce parent sProc. En SQL2000, le sProc interne ou "enfant" n'a aucun problème INSÉRER dans #TEMP ou SELECT des données de #TEMP. En bref, je suppose qu'ils peuvent tous se référer à ce #TEMP parce qu'ils utilisent la même connexion.L'enfant sProc ne peut pas référencer une table temporaire locale créée dans le parent sProc

Lors de tests avec SQL2008, je trouve 2 manifestations de comportement différent. Tout d'abord, au moment du design, la nouvelle fonctionnalité "intellisense" se plaint dans Management Studio EDIT de l'enfant sProc que #TEMP est un "nom d'objet invalide". Mais pire est qu'au moment de l'exécution, le parent sProc invoqué échoue à l'intérieur de l'enfant sProc imbriqué. Quelqu'un a suggéré que la solution est de changer à ## TEMP qui est apparemment une table temporaire globale qui peut être référencée à partir de différentes connexions. Cela semble une proposition trop drastique à la fois de la quantité de travail pour chasser tous les points problématiques ainsi que des effets nuisibles possibles/probables lorsque ces sProcs sont invoqués à partir d'applications Web (c'est-à-dire des problèmes multi-utilisateurs).

Est-ce vraiment un changement de comportement dans SQL2005 ou SQL2008 concernant #TEMP (tables temporaires locales)? Nous avons sauté 2005 mais j'aimerais apprendre plus précisément pourquoi cela se produit avant que je pars et essaye de pirater les corrections nécessaires. Merci.

Répondre

2

partager une table temporaire entre les procédures stockées est une fonctionnalité intéressante à utiliser: http://www.sommarskog.se/share_data.html#temptables, je suis surpris que cela ne fonctionne pas pour vous. Peut-être devriez-vous essayer un exemple très simple et voir si cela fonctionnera. Ensuite, si cela fonctionne commencer à regarder d'autres raisons.

essayer ceci d'une fenêtre de requête en studio de gestion:

créer ces deux procédures:

CREATE PROCEDURE called_procedure 
(@par1 int, @par2 char(5)) 
AS 
INSERT INTO #tmp VALUES (@par1,@par2) 
GO 

CREATE PROCEDURE caller 
AS 

CREATE TABLE #tmp (col1 int  NOT NULL 
        ,col2 char(5) NULL 
       ) 
EXEC called_procedure 1, 'AAA' 
EXEC called_procedure 2, 'BBB' 

SELECT * FROM #tmp 
GO 

les exécuter alors:

exec caller 

C'est ce que je reçois sur SQL Server 2005 :

col1  col2 
----------- ----- 
1   AAA 
2   BBB 

(2 row(s) affected) 
1

Nous le faisons maintenant (sur 2000, 2005 et 2008) exactement comme vous le décrivez sans avoir à changer les tables temporaires locales à globales.

+0

Merci. Cela doit être quelque chose de plus subtil. Je regarderai plus profondément le ou les fauteurs de trouble. –

Questions connexes