MS-SQLでは、どのようにして一時テーブルにINSERTを挿入し、最初に一時テーブルを宣言せずにIDENTITYフィールドを作成しますか?


36

一時テーブルに複数のデータを選択して2次計算を行う必要があります。より効率的に動作させるために、そのテーブルにIDENTITYカラムが必要です。私はIDを持って最初にテーブルを宣言してから残りのデータを挿入することができますが、1ステップでそれを行う方法はありますか?

+1

IDENTITY列から#TempSections にFix2IDs としてセクションIDは、複数のユーザーのために物事を一貫します。 PRIMARY KEYは物事を効率的にします。効果を最大限に発揮するには両方を使用 23 9月. 082008-09-23 20:28:18

64

ああがた:

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

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

  0

oldtableにID列がある場合は動作しません 23 9月. 082008-09-23 20:38:39

+1

もちろん、2つのIDを持つことはできません。クエリーの一部としてident colを選択しないでください 23 9月. 082008-09-23 20:54:24

  0

ORDER BY句を使用し、 "idcol"が同じ順序であることを期待する場合は注意が必要です。 http://support.microsoft.com/kb/273586 04 10月. 112011-10-04 18:28:36

  0

currenttとして選択したキャスト(CurrentIDをintとして)oldtableにID列がある場合は、このようにしてください 05 2月. 142014-02-05 17:58:29


-4

IIRCでは、INSERT INTOコマンドはソーステーブルのスキーマを使用して一時テーブルを作成します。これは、追加の列を持つ表を作成しようとするだけの理由がない理由の一部です。 ID列は、内部的に、ジェネレータと呼ばれるSQL Server構造に関連付けられています。少し信仰の


-3

あなたが選択フィールドに基づいて、その場でテーブル構造を作成しますSELECT INTOを行うことができますが、私はしないでくださいそれがあなたのためのアイデンティティフィールドを作成すると思います。

ALTER TABLE #mytable 
ADD PRIMARY KEY(KeyColumn) 

列名の変数になりません。


1

物事を効率的に作成するには、いずれかの列が主キーであることをことを宣言行う必要があります。

私は、IDENTITYとPRIMARY KEYを直接設定できるように、#myTable TABLE(またはおそらくDECLARE TABLE @myTable)を作成することをお勧めします。

  0

これは依存します。索引付けされた表への挿入は、B +ツリーのメンテナンスのために索引付けされていない表よりも低速です(例外はほとんどありません)。価値のあるインデックスを作るために、このアプリには一時テーブルに十分なデータが読み込まれていない可能性があります。まったく状況に依存しており、われわれは知るべき情報が不十分です 23 9月. 082008-09-23 20:58:20

  0

彼は「物事を効率的に」するための「アイデンティティ」を望んでいます。私たちは、すでに存在していないIDで項目にアクセスしたいと考えています。すでに存在していないIDでソートするのは簡単です。 23 9月. 082008-09-23 21:53:05

  0

彼は効率的ではありません - スピードではなく、使いやすさのためにアイデンティティを求めていたというのが私の考えでした。しかし、それがパフォーマンスのものであれば、既存の列の1つをインデックスするだけです。 23 9月. 082008-09-23 23:19:48


5

あなたはコメントしました:oldtableにID列がある場合は動作しません。

私はあなたの答えだと思います。 #newtableはoldtableからID列を自動的に取得します。次の文を実行してください:

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

select * into #newtable from oldtable 

use tempdb 
GO 
sp_help #newtable 

これは#newtableにID列があることを示しています。あなたはID列を使用しない場合

、#newtableの作成時にこれを試してみてください。

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

1

良い質問& Mattのは良い答えでした。

CREATE TABLE [dbo].[oldtable] 
(
    [oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, 
    [col1] [nvarchar](50) NULL, 
    [col2] [numeric](18, 0) NULL, 
) 
: - oldtableはのような何かをスクリプト化された場合だろう

SELECT col1, col2, IDENTITY(int) AS idcol 

    INTO #newtable 

    FROM oldtable 

:oldtableは、ユーザーは次のことを実行できアイデンティティを持っている場合、構文上の少しを展開するには

Thxを4この質問は、私を助け情報、

Catto


2

現在のIDである列をインクルードしたい場合でも、これを行うことはできますが、明示的に列をリストし、現在のIDをintにキャストする必要があります(今の場合)。

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

これは私のために働いています。ありがとう 05 2月. 142014-02-05 17:57:34


0

*の後に、もう一度クエリを中断するidcolumnのエイリアスをつけて、新しい名前を付けてください...それは魔法のように動作し始めます。 TempID AS

選択IDENTITY(int型)、*、Files_Sections