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?
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
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
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
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.
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
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.