web-dev-qa-db-fra.com

En MS-SQL, comment puis-je INSERER DANS une table temporaire et créer un champ IDENTITY sans d'abord déclarer la table temporaire?

Je dois sélectionner un tas de données dans une table temporaire pour ensuite effectuer des calculs secondaires. Pour que cela fonctionne plus efficacement, j'aimerais avoir une colonne IDENTITY sur cette table. Je sais que je pourrais commencer par déclarer la table avec une identité, puis y insérer le reste des données, mais existe-t-il un moyen de le faire en une étape?

38
Dale B

Oh, vous avez peu de foi!

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

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

70
Matt Rogish

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

Je pense que c'est ta réponse. La #newtable obtient automatiquement une colonne d'identité de la table oldtable. Exécutez les prochaines 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

Cela vous montre que #newtable a la colonne identité.

Si vous ne voulez pas la colonne identité, essayez ceci lors de la création de #newtable:

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

Si vous souhaitez inclure la colonne qui est l'identité actuelle, vous pouvez toujours le faire, mais vous devez explicitement répertorier les colonnes et convertir l'identité actuelle en un entier (en supposant qu'il en soit maintenant), comme suit:

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

Pour rendre les choses efficaces, vous devez déclarer que l'une des colonnes est une clé primaire:

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)

Cela ne prendra pas une variable pour le nom de la colonne.

Faites-moi confiance, vous feriez mieux de faire un CREATE #myTable TABLE (ou éventuellement un DECLARE TABLE @myTable), ce qui vous permet de définir directement IDENTITY et PRIMARY KEY.

1
Amy B

Bonne question et Matt était une bonne réponse. Pour développer un peu la syntaxe si l'ancienne table a une identité, un utilisateur peut lancer ceci:

SELECT col1, col2, IDENTITY( int ) AS idcol

  INTO #newtable

  FROM oldtable

-

Ce serait si la vieille table était scriptée quelque chose comme tel:

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

1
Catto

Si après le *, vous alias l'idcolumn qui rompt la requête une seconde fois ... et lui donnez un nouveau nom ... il commence à fonctionner comme par magie.

Sélectionnez IDENTITY (int) AS TempID, *, SectionID en tant que Fix2IDs Dans #TempSections À partir de Files_Sections.

0
RichM