50 votes

Dans MS-SQL, comment puis-je l'INSÉRER DANS une table temporaire, et ont un champ d'IDENTITÉ créé, sans déclarer d'abord la table temporaire?

J'ai besoin de sélectionner un tas de données dans une table temporaire pour ensuite, faire un peu secondaire calculs; Pour vous aider à travailler plus efficacement, je voudrais avoir une IDENTITÉ, d'une colonne d'un tableau. Je sais que je déclare d'abord la table avec une identité, puis insérez le reste des données, mais est-il un moyen de le faire en 1 étape?

96voto

Matt Rogish Points 11824

Ô gens de peu de foi:

SELECT *, IDENTITY( int ) AS idcol
  INTO #newtable
  FROM oldtable

http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx

6voto

Frans Points 1453

Vous avez dit: ne fonctionne pas si oldtable a une colonne d'identité.

Je pense que c'est votre réponse. Le #nouvelletable obtient une colonne d'identité de la oldtable automatiquement. Le prochain déclarations:

create table oldtable (id int not null identity(1,1), v varchar(10) )

select * into #newtable from oldtable

use tempdb
GO
sp_help #newtable

Il vous montre que #nouvelletable n'ont la colonne d'identité.

Si vous ne voulez pas l'identité de la colonne, essayer à la création de #nouvelletable:

select id + 1 - 1 as nid, v, IDENTITY( int ) as id into #newtable
     from oldtable

4voto

Catto Points 756

Bonne Question & Matt était une bonne réponse. Afin d'étendre la syntaxe un peu si le oldtable a une identité d'un utilisateur peut exécuter les opérations suivantes:

SELECT col1, col2, IDENTITY( int ) AS idcol

  INTO #newtable

  FROM oldtable

--

Qui serait le cas si le oldtable a été écrit quelque chose comme tels:

CREATE TABLE [dbo].[oldtable]
(
    [oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [col1] [nvarchar](50) NULL,
    [col2] [numeric](18, 0) NULL,
)

Thx 4 l'info, cette question m'a aidé,

Catto

2voto

HLGEM Points 54641

Si vous souhaitez inclure la colonne qui est l'identité actuelle, vous pouvez toujours le faire, mais vous devez explicitement la liste des colonnes et fonte d'identité en cours pour un int (en supposant qu'il est maintenant), comme ceci:

select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID 
into #temp
from myserver.dbo.mytable

1voto

David B Points 53123

Pour rendre les choses efficace, vous devez faire déclarer que l'une des colonnes de clé primaire:

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)

Qui ne prend pas une variable pour le nom de la colonne.

Faites-moi confiance, vous êtes BEAUCOUP mieux de faire un : CRÉER #TABLE myTable (ou, éventuellement, de DÉCLARER le TABLEAU @matable) , qui permet de définir l'IDENTITÉ et la CLÉ PRIMAIRE directement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X