2010-10-20 11 views
3

j'ai pris quelques SQL similaire à ce qui suit:Comment insérer dans tempoary table deux fois

IF EXISTS(SELECT name FROM tempdb..sysobjects WHERE name Like N'#tmp%' 
and id=object_id('tempdb..#tmp')) 
DROP TABLE #tmp 

into #tmp 
select * from permTable 

Je dois ajouter des données à #tmp avant poursuite du traitement:

insert into #tmp 
select * from permTable2 

Mais cela donne des erreurs car SQL a pris des tailles et des types pour les colonnes #tmp (par exemple si permTable a une colonne pleine de ints mais permTable2 a une colonne avec le même nom mais avec une valeur NULL dans un enregistrement "Impossible d'insérer la valeur NULL dans la colonne 'IsPremium ', table' tempdb.dbo. # tmp ").

Comment obtenir #tmp pour avoir les types que je veux? Est-ce vraiment une mauvaise pratique?

+0

dites-vous que permTable et permTable2 ont des schémas différents? –

+0

Ils n'existent pas car il s'agit d'un exemple simplifié mais pour les besoins de cet exemple, les tables auront les mêmes schémas – Patrick

+1

BTW - J'éviterais select * dans - cela rendra toute modification apportée à la table source un changement de rupture. –

Répondre

5

Avez-vous envisagé de créer une table var à la place? Vous pouvez déclarer les colonnes comme telles

declare @sometable table(
    SomeField [nvarchar](15), 
    SomeOtherField [decimal](15,2)); 
+0

Cool, semble bon. Est-ce que sometable est créé au même endroit, a le même cycle de vie, etc. que #tmp? – Patrick

+1

Les variables de table sont hors de portée avec la proc ou la fonction, où les tables temporaires sont hors de portée à la fin de la session. Voir http://databases.aspfaq.com/database/should-i-use-a-temp-table-or-a-table-variable.html pour plus de détails –

+0

Great link, thank you – Patrick

1

C'est pourquoi select into est une mauvaise idée pour votre problème. Créez la structure de table spécifiquement avec une commande create table, puis écrivez deux instructions d'insertion.

Questions connexes