2010-12-15 8 views
0

J'ai 2 procédure de magasin:ennuis de table temporaire dans SQL Server

Le premier à créer #temptable

CREATE PROCEDURE CreateTempTable 
AS 
BEGIN 
    IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
    BEGIN 
     DROP TABLE #TempTable; 
    END 

    CREATE TABLE #TempTable(
     Value real NOT NULL   
END 

Le second pour insérer des données dans mon #temptable

CREATE PROCEDURE InsertData 
     @Value real 
    AS 
    BEGIN 
     INSERT #TempTable (Value) VALUES @Value 
    END 

Lorsque j'appelle cette procédure, j'ai une erreur:

exec CreateTempTable 
exec InsertData" 1 
go 

Nom '#temptable' pas valable dans InsertData

Pouvez-vous me aider?

Répondre

2

Une table temporaire créée à l'intérieur d'un sproc est automatiquement lâchée après la fin du sproc.

Vous avez quelques choix:

  • Créez la table temporaire en dehors de la procédure stockée comme une requête autonome. Ensuite, il sera abandonné après que la connexion se ferme
  • Créer une sproc qui crée d'abord la table temporaire, puis appelle les autres sprocs
  • Utilisez une table temporaire globale (attention - les problèmes de concurrence peuvent surgir à ce sujet)
1

Je suppose que le problème ici est que vous créez une table temporaire locale, qui ne peut pas être accessible en dehors de CreateTempTable. Vous devez créer une table temporaire globale, en utilisant ## au lieu de #.

Modifier Oui, c'est ça. Voici votre script fixe:

CREATE PROCEDURE CreateTempTable 
AS 
BEGIN 
    IF OBJECT_ID('tempdb..##TempTable') IS NOT NULL 
    BEGIN 
     DROP TABLE ##TempTable; 
    END 

    CREATE TABLE ##TempTable(
     Value real NOT NULL 
    ) 
END 
GO 

CREATE PROCEDURE InsertData 
    @Value real 
AS 
BEGIN 
    INSERT ##TempTable (Value) VALUES (@Value) 
END 
GO 

exec CreateTempTable 
exec InsertData 1 
go 
+0

Les tables temporaires globales présentent des problèmes de conflit si le sproc est exécuté par plusieurs utilisateurs à la fois. Ce n'est probablement pas une bonne idée de simplement le rendre global et l'appeler un jour. – Donnie

+0

Oui, mais ce n'était pas * ce que le PO demandait. En tous cas, merci pour l'info. – rsenna

Questions connexes