私はselect into構文を使用してtempテーブルを作成したいと思います。 Like:SQLテーブルからのプライマリキーのドロップ
select top 0 * into #AffectedRecord from MyTable
Mytableには主キーがあります。構文主キーにマージを使ってレコードを挿入すると問題になります。どのように私は、一時テーブルから
私はselect into構文を使用してtempテーブルを作成したいと思います。 Like:SQLテーブルからのプライマリキーのドロップ
select top 0 * into #AffectedRecord from MyTable
Mytableには主キーがあります。構文主キーにマージを使ってレコードを挿入すると問題になります。どのように私は、一時テーブルから
を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
これがうまくいけばよいと思います。
サイドノート:これは、選択した挿入がどのように動作するかを理解し、理解するのに適しています。私はパーマテーブルを使用しました。これは簡単に見つけることができるためです。
ありがとうございました。私はテーブルを手動で作成します。私は選択をあきらめた – seyfside
あなたは 'IDENTI' PKについて話していますか?その場合は、http://stackoverflow.com/questions/7063501/how-to-turn-identity-insert-on-and-off-using-sql-server-2008#7063527をご覧ください。制約を取り除く必要はありません。 – Jens
私はこれを使用することはできません。エラーメッセージ:テーブル '#AffectedRecord'のID列の明示的な値は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。 – seyfside
私はあなたが実際に 'IDENTITY_INSERT'を見ることをお勧めします – Jens