2010-11-27 44 views
2

Je dois créer une table temporaire dans l'une de mes procédures stockées. Les données à insérer dans la table temporaire sont dérivées d'une requête de pivot dynamique - d'où je suis lié à SQL dynamique. Ainsi, il devient quelque chose comme ça -Comment concevoir l'utilisation de la table temporaire Global pour un environnement multi-utilisateur? (ou alternatives)

set query = 'select ....'+ pivotcols + 
      ' into ##temp_table 
       from base_table 
       pivot (
       max(col1) 
       for col2 in 
       (' + pivotcols +' as final' 

exec(query) 

Ici, je ne peux pas utiliser la table temporaire locale (#temp_table), depuis la table créée dans le SQL dynamique ne sera pas disponible pour le reste de la procédure stockée. Donc, je finis par utiliser une table temporaire globale (## temp_table).

Maintenant, le problème est que s'il y a une sortie imprévue du proc stocké où la table ne tombe pas correctement, il peut déclencher des exceptions quand quelqu'un d'autre essaie d'utiliser le même sp. Même sans exception, si deux personnes exécutent la même procédure, il peut y avoir des problèmes. Y-a t'il une solution à ce problème? Toutes les alternatives que je peux utiliser?

Remarque: Je dois utiliser SQL dynamique - la requête pivot ne peut être dynamisée d'aucune autre manière, car les colonnes qui seront pivotées sont décidées au moment de l'exécution. Mais je suis flexible à la façon dont les données vont réellement dans la table temporaire.

EDIT: sous la direction « variable » dans la question à la rubrique « table »

+0

D'une part, vous dites que vous devez utiliser SQL dynamique pour construire la table temporaire, parce que la structure de la table est déterminée à (colonnes pivotée) d'exécution, mais D'un autre côté, vous dites que le reste de votre sproc n'utilise pas SQL dynamique? Quoi qu'il en soit, l'utilisation de SQL dynamique pour le reste du proc serait le meilleur. –

+0

C'est une surcharge inutile. J'ai juste besoin de faire 'select t. * From ## temp ..' avec une jointure sur d'autres tables pour retourner le jeu de résultats à l'application. Je cherche d'autres options si possible avant de tout rendre dynamique. –

Répondre

1

Vous pouvez ajouter une valeur dérivée d'un GUID au nom de la table temporaire. Voici une façon qui supprime également les traits d'union.

set query = 'select ....'+ pivotcols + 
      ' into ##temp_table' + REPLACE(CAST(NEWID() as varchar(50)), '-','') 

NEWID() donnera une valeur différente à chaque fois.

+0

Comment utiliser la table après cela? Rappelez-vous, je le stocke dans la table temporaire seulement parce que je veux l'utiliser quelque part sur la ligne dans le SP. Dois-je dépendre du SQL dynamique pour toutes les requêtes restantes? –

0

Vous pouvez vérifier la condition si la table temporaire globale existe en utilisant les instructions sql ci-dessous.

IF OBJECT_ID('##temp') IS NOT NULL 
drop table ##temp 

espère que cela vous aidera pour vous

+0

Non, cela ne fonctionne pas avec les tables temporaires globales. Au moins ça ne marche pas pour moi, l'as-tu essayé toi-même? –

+0

Oui, j'ai essayé et ça fonctionne bien à ma fin. Si vous trouvez un problème avec cela s'il vous plaît faites le moi savoir. –

+0

Etes-vous positif que vous avez essayé avec les tableaux temporaires globaux? Cela fonctionne très bien avec les tables normales, mais pas avec les tables temporaires globales. –