2010-02-03 7 views
10

Je cherche à créer une table temporaire qui est utilisée comme table intermédiaire lors de la compilation d'un rapport.SQL Server créant une table temporaire à partir d'une autre table

Pour un peu de fond, je suis un VB 6 PORTAGE application .NET

Pour créer la table, je peux utiliser ...

SELECT TOP 0 * INTO #temp_copy FROM temp; 

Cela crée une copie vide de la température, mais il ne crée pas de clé primaire

Existe-t-il un moyen de créer une table temporaire plus les contraintes?

Devrais-je créer les contraintes par la suite?

Ou je ferais mieux de simplement créer la table en utilisant créer une table, je ne voulais pas faire cela parce qu'il y a 45 colonnes dans la table et cela remplirait la procédure avec beaucoup de cruft inutiles.

Le tableau est nécessaire parce que beaucoup de gens peuvent être générer des rapports en même temps je ne peux pas utiliser une seule table intermédiaire

Répondre

7

Avez-vous besoin en fait une clé primaire? Si vous flitertez et que vous sélectionnez uniquement les données nécessaires au rapport, ne devrez-vous pas visiter toutes les lignes de la table temporaire?

+0

J'ai trouvé utile d'ajouter des index aux tables temporaires à des occasions avec des résultats impressionnants. Il peut y avoir un traitement intermédiaire ou JOINs etc – gbn

+1

@gbn: bien sûr. Je les ajoute quand ils sont nécessaires. –

+0

Vous avez raison, cela peut être superflu. Je vais devoir vérifier chaque procédure. A l'origine l'application utilisait une seule table temporaire avec une clé primaire, mais le nombre d'utilisateurs était petit, maintenant je crains que la table temporaire devienne un goulot d'étranglement car il y a beaucoup plus d'utilisateurs – DeveloperChris

6

Vous auriez à faire l'un ou l'autre:

  • ajouter les PK/index après
  • déclarer explicitement la table temporaire avec des contraintes.

Je voudrais aussi faire cela plutôt que TOP 0

SELECT * INTO #temp_copy FROM temp WHERE 1 = 0; 
7

De par sa conception, SELECT INTO ne porte pas sur les contraintes (PK, FK, unique), par défaut, chèques, etc. En effet, un SELECT INTO peut réellement tirer de nombreuses tables à la fois (via des jointures dans la clause FROM). Puisque SELECT INTO crée une nouvelle table à partir des tables que vous spécifiez, SQL n'a aucun moyen de déterminer quelles contraintes vous voulez conserver et celles que vous ne voulez pas conserver.

Vous pouvez écrire une procédure/script pour créer la contrainte automatiquement, mais c'est probablement trop d'effort pour un gain minimal.

+0

Merci d'avoir expliqué ça, assez évident je suppose vous voyez la raison. – DeveloperChris

Questions connexes