データベース

データベースに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし)
IDENTITYが指定されたいるテーブルへの、他テーブルからの一括挿入の簡素化について
投稿日時: 19/08/21 23:07:32
投稿者: 富山の初心者

お願いします。
 
下記のような定義のテーブルが2ケあり、
CREATE TABLE TABLE_A(
 ID int IDENTITY(1,1) NOT NULL
,CODE varchar(10)
,NAME varchar(10)
PRIMARY KEY(ID)
);
CREATE TABLE TABLE_B(
 ID int IDENTITY(1,1) NOT NULL
,CODE varchar(10)
,NAME varchar(10)
PRIMARY KEY(ID)
);
 
TABLE_Aに下記でデータを挿入します。
SET IDENTITY_INSERT TABLE_A ON;
INSERT INTO TABLE_A (ID,CODE,NAME) VALUES (1,'A','AA'),(2,'B','BB'),(3,'C','CC');
SET IDENTITY_INSERT TABLE_A OFF
 
TABLE_BへTABLE_Aから引用挿入するものとします。
1.下記は正常に実行できます。
TRUNCATE TABLE TABLE_B;
SET IDENTITY_INSERT TABLE_B ON;
INSERT INTO TABLE_B (ID,CODE,NAME) SELECT ID,CODE,NAME FROM TABLE_A;
SET IDENTITY_INSERT TABLE_B OFF
 
2.下記も正常に実行できます。
TRUNCATE TABLE TABLE_B;
SET IDENTITY_INSERT TABLE_B ON;
INSERT INTO TABLE_B (ID,CODE,NAME) SELECT * FROM TABLE_A;
SET IDENTITY_INSERT TABLE_B OFF
 
3.下記は正常に実行できません。
TRUNCATE TABLE TABLE_B;
SET IDENTITY_INSERT TABLE_B ON;
INSERT INTO TABLE_B SELECT * FROM TABLE_A;
SET IDENTITY_INSERT TABLE_B OFF
 
そこで質問です。
3.のように、列名を指定せずに実行できる方法はありませんか?
例では、列項目はID,CODE,NAMEの3ケですが、
実際には40ケ位あり、指定がめんどうなので、質問にいたりました。
 
 

回答
投稿日時: 19/08/22 09:43:27
投稿者: sk

引用:
CREATE TABLE TABLE_B(
 ID int IDENTITY(1,1) NOT NULL
,CODE varchar(10)
,NAME varchar(10)
PRIMARY KEY(ID)
);

引用:
1.下記は正常に実行できます。
TRUNCATE TABLE TABLE_B;
SET IDENTITY_INSERT TABLE_B ON;
INSERT INTO TABLE_B (ID,CODE,NAME) SELECT ID,CODE,NAME FROM TABLE_A;
SET IDENTITY_INSERT TABLE_B OFF

引用:
3.下記は正常に実行できません。
TRUNCATE TABLE TABLE_B;
SET IDENTITY_INSERT TABLE_B ON;
INSERT INTO TABLE_B SELECT * FROM TABLE_A;
SET IDENTITY_INSERT TABLE_B OFF

引用:
3.のように、列名を指定せずに実行できる方法はありませんか?

この場合は列リストの指定が必須です。
 
引用:
例では、列項目はID,CODE,NAMEの3ケですが、
実際には40ケ位あり、指定がめんどうなので、質問にいたりました。

システムオブジェクトにアクセスできる権限があるならば、
例えば SQL 文(列リストに当たる文字列)を動的に生成して EXECUTE 文で実行、
という代替策が考えられますが、それはそれで面倒だと思います。

投稿日時: 19/08/24 20:41:03
投稿者: 富山の初心者

sk様 ありがとうございます。
 

引用:
この場合は列リストの指定が必須です。
わかりました。
 
引用:
システムオブジェクトにアクセスできる権限があるならば、
例えば SQL 文(列リストに当たる文字列)を動的に生成して EXECUTE 文で実行、
という代替策が考えられますが、それはそれで面倒だと思います。
私もそう思います。
 
ありがとうございました。
 
解決とさせていただきます。