2017-03-24 16 views
0

私はselect into構文を使用してtempテーブルを作成したいと思います。 Like:SQLテーブルからのプライマリキーのドロップ

select top 0 * into #AffectedRecord from MyTable 

Mytableには主キーがあります。構文主キーにマージを使ってレコードを挿入すると問題になります。どのように私は、一時テーブルから

+0

あなたは 'IDENTI' PKについて話していますか?その場合は、http://stackoverflow.com/questions/7063501/how-to-turn-identity-insert-on-and-off-using-sql-server-2008#7063527をご覧ください。制約を取り除く必要はありません。 – Jens

+0

私はこれを使用することはできません。エラーメッセージ:テーブル '#AffectedRecord'のID列の明示的な値は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。 – seyfside

+0

私はあなたが実際に 'IDENTITY_INSERT'を見ることをお勧めします – Jens

答えて

0

をPK制約をドロップすることができ、「TOP(0)INTOを選択..」トリックは賢いですが、私の推薦はちょうどこのような理由から、テーブルからスクリプトに自分自身です。一方、実際にデータを取り込むときにSELECT INTOを使用すると、テーブルを作成して挿入するよりも、しばしば高速です。特に2014+システムで。

主キーの存在は、問題とは関係ありません。 SELECT INTOを別のテーブルから使用すると、キーの制約とインデックスが作成されないため、データ型とNULLabilityが行います。次のコードを考えてみて、私のコメントの点に注意してください。

USE tempdb -- a good place for testing on non-prod servers. 
GO 

IF OBJECT_ID('dbo.t1') IS NOT NULL DROP TABLE dbo.t1; 
IF OBJECT_ID('dbo.t2') IS NOT NULL DROP TABLE dbo.t2; 
GO 

CREATE TABLE dbo.t1 
(
    id int identity primary key clustered, 
    col1 varchar(10) NOT NULL, 
    col2 int   NULL 
); 
GO 

INSERT dbo.t1(col1) VALUES ('a'),('b'); 

SELECT TOP (0) 
    id, -- this create the column including the identity but NOT the primary key 
    CAST(id AS int) AS id2, -- this will create the column but it will be nullable. No identity 
    ISNULL(CAST(id AS int),0) AS id3, -- this this create the column and make it nullable. No identity. 
    col1, 
    col2 
INTO dbo.t2 
FROM t1; 

は、ここで私が作成した新しいテーブルの(簡略化のためにクリーンアップ)DDLです:主キーがなくなっていることを

-- New table 
CREATE TABLE dbo.t2 
(
    id int IDENTITY(1,1) NOT NULL, 
    id2 int    NULL, 
    id3 int    NOT NULL, 
    col1 varchar(10)  NOT NULL, 
    col2 int    NULL 
); 

注意してください。私がIDをそのまま持ち込んだとき、それはアイデンティティを保った。 intとしてidカラムを鋳造は、(それがすでにint型であっても)私はアイデンティティ挿入を処分した方法です。 ISNULLを追加すると、列をNULLにすることができます。

デフォルトでは、identity insertはここでoffに設定されており、このクエリーに失敗します。 VALUE(1,1)

SET IDENTITY_INSERT dbo.t2 ON; 
INSERT dbo.t2 (id, id3, col1) VALUES (1, 1, 'x'); 

をしかし、今はその列の値を提供しなければならない:

Msg 544, Level 16, State 1, Line 39 
Cannot insert explicit value for identity column in table 't2' when IDENTITY_INSERT is set to OFF. 

設定アイデンティティは、問題を修正するに挿入します。ここでエラーを確認してください:

INSERT dbo.t2 (id3, col1) VALUES (1, 'x'); 


Msg 545, Level 16, State 1, Line 51 
Explicit value must be specified for identity column in table 't2' either when IDENTITY_INSERT is set to ON 

これがうまくいけばよいと思います。

サイドノート:これは、選択した挿入がどのように動作するかを理解し、理解するのに適しています。私はパーマテーブルを使用しました。これは簡単に見つけることができるためです。

+0

ありがとうございました。私はテーブルを手動で作成します。私は選択をあきらめた – seyfside

関連する問題