質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2133閲覧

インポートしたテーブルのIDを+IDにする

maam

総合スコア55

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/02/21 02:53

編集2019/02/26 01:12

3つのDB(DB1,DB2,DB3)のサーバからテーブルのデータをそれぞれ取得し、
それらを一つのテーブルへインポートしています。
カラムは3つとも同じ(ID、GroupName、CompanyCode)で、データの中身だけが違います。
既に作成しているインポート先(Master)にはデータが入っています。
3つのテーブルをそれぞれインポートするときに、IDは連番にしたいです。
今はテーブルごとにID:1~10になっているので
インポートするときにIDの最大数+IDにすれば連番になるのではないかと考えました。
ですがその方法がわからず困っています。
なにかアドバイスをいただけないでしょうか。

SQL

1BULK INSERT Master 2FROM 'D:\フォルダパス\MST_A.csv' 3WITH 4( 5 FIELDTERMINATOR = ',', 6 ROWTERMINATOR = '\n' 7); 8

追記
以前ご質問させていただいた際、オートナンバー型に変更すれば良いとのアドバイスをいただいたのですが、型変更なしで実行をしたいです。
インポートするDB2のIDを ”DB1の最大IDを加えたID”
インポートするDB3のIDを ”DB2の最大IDを加えたID”
とする方法はありますか?

例)
DB1 テーブル;data1
ID  GroupName  CompanyCode

1 A A
2 B B
3 C C

DB2 テーブル;data1
ID  GroupName  CompanyCode

1 D  D
2 E E
3 F F
だとしたら
既にデータが入っているMasterにインポートすると

DB4 テーブル:Master
ID  GroupName  CompanyCode

1 AA AA    
2 BB BB
3 CC CC    』が元々のMaster
4 A A
5 B B
6 C C  』追加でインポートしたdata1
7 D D
8 E E
9 F F    』追加でインポートしたdata2

というふうになってほしいです。

SQL

1SELECT A2.id + (SELECT MAX(id) FROM [dbMst].[dbo].data1)AS ForecastGroupID, A2.GroupName, A2.CompanyCode 2 FROM [dbMst].[dbo].Master A2

上記のコードを作成してみましたが、
”in、out、format のいずれかのオプションの有効なテーブル名を指定してください。”とログがでてしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/02/25 08:38 編集

追記の内容は連番とは言いませんよ。 また、インポート先のテーブルでそれぞれのDBごとの最大値求めるなら、どのDBから取得したのかの識別が必要だと思いますが、そうでないならどのように判断しますか?
maam

2019/02/25 08:23

ご指摘ありがとうございます。その通りですね。 インポート先であるテーブルMasterでの最大値を取得していきたいです。DB1~3のテーブルをインポートして、そのたびにIDの最大値を取ればよいのかなと…
sazi

2019/02/25 08:28

繰り返しますが、既に複数のDBの値が登録されている状態で、DBの識別なしにどうやって取得しますか?
maam

2019/02/25 08:38

DB毎に取得しようと思っているので、DBの数分コードを書こうと思っているのですが、考え方が間違っていますでしょうか…。
sazi

2019/02/25 08:41

select max(id) from Master 現状のレイアウトでは上記の取得方法しかありません。 インポートしたDB毎の最大値はどうやって求めますか?
sazi

2019/02/25 08:46 編集

1回きりなら、「DB1~3のテーブルをインポートして、そのたびにIDの最大値」は可能でしょうけど、 そのデータが登録されている状態で、次に同じことしたら、DBごとの続きは不明ですよ?
maam

2019/02/25 08:54

インポートしたDB毎の最大値はどうやって求めますか? >Masterのidの最大値という風に指定することはできないのでしょうか。 それが可能なら、次に同じことをしてもテーブルは変わらないので…
sazi

2019/02/25 08:58

Masterのidの最大値は求められますが、やりたいのはDB事のID連番なのではないですか?
sazi

2019/02/25 08:58

データの事例を質問に追記して下さい。
maam

2019/02/26 01:13

追記しました。よろしくお願いします。
sazi

2019/02/26 01:21 編集

追記確認しました。 連番ですね。 では、オートナンバー型ではなく連番にするという事が要望だと思います。 トリガーを使用すれば型は変更せずにオートナンバーと同じ動作は可能だだと思います。
sazi

2019/02/26 01:22

ひょっとして、オートナンバーに変えようとしたけど出来ないからが理由になっていたりします?
maam

2019/02/26 01:58

はい、オートナンバーに変えることができなかったのと、型変更は避けたいとの要望があったからです。
sazi

2019/02/26 02:15

オートナンバー型とは言いますけど、プロパティをIDENTITYにするので、数値型であれば型はそのままなのですけど、それも駄目って事ですか?
guest

回答3

0

ベストアンサー

いったん一時テーブルに入れてみてはどうでしょうか。

sql

1-- 一時テーブルを作成する 2create table #MST_A ( 3 ID int, 4 GroupName varchar(100), 5 CompanyName varchar(100) 6); 7create table #MST_B ( 8 ID int, 9 GroupName varchar(100), 10 CompanyName varchar(100) 11); 12-- 一時テーブルにCSVの内容を取り込む 13bulk insert #MST_A 14from 'D:\path\to\MST_A.csv' 15with ( 16 fieldterminator = ',', 17 rowterminator = '\n' 18); 19bulk insert #MST_B 20from 'D:\path\to\MST_B.csv' 21with ( 22 fieldterminator = ',', 23 rowterminator = '\n' 24) 25-- MasterテーブルのID最大値+1でinsert 26insert into [Master] 27select 28 ID+(select max(ID) from [Master]), 29 GroupName, 30 CompanyName 31from 32 #MST_A; 33insert into [Master] 34select 35 ID+(select max(ID) from [Master]), 36 GroupName, 37 CompanyName 38from 39 #MST_B;

投稿2019/02/26 03:55

alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

オートナンバー型の列があれば連番にするという目的は叶います。

後は取込の方法ですが、幾つか考えられます。

1.Masterのレイアウトを変更する
オートナンバー型の列を追加して、それ以外の項目をinsert

SQL

1BULK INSERT Master(ID, GroupName, CompanyCode) 2FROM 'D:\フォルダパス\MST_A.csv'

2.MasterのIDをオートナンバー型に変更して取込の項目をスキップする
フォーマット ファイルを使用したテーブル列のスキップ (SQL Server)

SQL

1BULK INSERT Master 2FROM 'D:\フォルダパス\MST_A.csv' 3 WITH (FORMATFILE = 'D:\フォルダパス\MST_A.fmt');

ただ、IDを全て通番にすると、どのサーバーのどのデータなのか分からなくなりませんか?
私なら、どのサーバー化の識別の項目を追加して、その項目はスキップしての取込後に識別項目に値が設定されていないものをUPDATEします。

投稿2019/02/21 03:16

編集2019/02/21 03:42
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maam

2019/02/21 03:54

丁寧なご回答ありがとうございます。 4つのテーブルをひとつにまとめるというのが仕様となっていますので、IDを連番にしないといけないんです。マージ後はどのサーバか、わからなくなってもいいのでこのような質問をさせていただきました。 オートナンバー型というのを知らなかったので勉強になりました。上記のURLを参考に再度考えてみます!またわからなくなったら質問させてください。
guest

0

BULK INSERT先のテーブルのID列を自動採番(IDENTITY)にしておけば
何もしなくても勝手に連番になると思いますが…

投稿2019/02/21 03:14

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maam

2019/02/25 05:51

ご回答ありがとうございます。 SQLServerからIDENTITYに変更しようと試みましたが、変更できませんとエラーが出ました…
hihijiji

2019/02/26 02:40

多分中身が入っているからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問