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

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

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

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

SQL

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

Q&A

解決済

2回答

6533閲覧

SSMSにてフラットファイル取り込み時に一部Nullが発生

退会済みユーザー

退会済みユーザー

総合スコア0

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2019/07/25 08:00

編集2019/07/26 07:47

イメージ説明## 実行したいこと

フラットファイルを正常に取り込みたい。


フラットファイルを取り込むと、特定カラムが必ず、途中行(毎回行数は異なる)からNullに変わってしまいます。
※元データは正常なデータです。

原因が分からず、大変こまっております。
どなたかご教授いただけないでしょうか

フラットファイルの内容

サイズ: 174MB
種類:テキストファイル
エンコード:ASCII

レイアウト情報:
column1: 10000115(8桁の英数字)
column2: 1(1-4までの数字一桁)
column3: 180025RS(8桁の英数字)
column4: 2(0-3までの数字一桁)

CREATE TABLE文


USE [aaa]
GO

/****** Object: Table [dbo].[bbb] Script Date: 2019/07/26 16:38:32 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[join_data_all_store_1](
[column1] char NULL,
[column2] char NOT NULL,
[column3] varchar NOT NULL,
[column4] char NOT NULL
) ON [PRIMARY]
GO

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

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

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

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

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

sazi

2019/07/25 08:35

テーブルの属性に合わずに、データがスキップされてNullになっているような感じですね。 どのようなデータをどのようなテーブル(特に型)に取り込もうとしているのか、質問に追記して下さい。
退会済みユーザー

退会済みユーザー

2019/07/25 09:02

sazi様 いつもご回答いただき有難うございます。 下記の内容になります。足りなければ、ご教授ください。 -データ encode: ASCII -Nullとなるカラム column1(8文字の数、英数字混じる): 10035053 →char(10)で取り込み -テーブル テーブルのプロパティで確認しました内容を画像で添付しております。 質問にお答えできているか分からず、異なりましたら再度ご教授いただければありがたいです。
hihijiji

2019/07/25 10:07

反映先のテーブルは実務で使用中のテーブルですか?
退会済みユーザー

退会済みユーザー

2019/07/25 10:09

いえ、データを入れたのち使用しようと思っております。
sazi

2019/07/26 00:27 編集

sqlserver の文字コードは何ですか? データは何のコード体系からasciiにエンコードしていますか?
退会済みユーザー

退会済みユーザー

2019/07/26 01:39

sazi様sqlserverの文字コードですが、utf-8だと思います。 shiftjisファイルを取り込むと文字化けをするので、すべてutf-8に変換しています。 データのコード体系を調べ方が分かりません。 データベースからデータを保存する際に、asciiにエンコードしていただいています。 もとのデータベースのコード体系ということでしょうか? 至らない点が多く申し訳ございません。
sazi

2019/07/26 02:08

コードの範囲は、ascii<sjisなので普通はsjisにエンコードなんですけどね。 そのフラットファイルなるものの形式を質問に追記(※)して下さい。 ※コメント欄に追記するより、閲覧されやすいです。
退会済みユーザー

退会済みユーザー

2019/07/26 03:12

sazi様 ご回答いただき有難うございます。 下記、内容で質問の回答になっていますでしょうか? ※アドバイスいただきました通り、質問に追記しております。 サイズ: 174MB 種類:テキストファイル エンコード:ASCII
hihijiji

2019/07/26 03:32 編集

キーや制約、トリガなどがないテーブルで試してみてください。 それで原因がテーブル側か手順-環境か切り分けできるとおもいます。
退会済みユーザー

退会済みユーザー

2019/07/26 03:53

アドバイスいただき、ありがとうございます。 キーや制約、トリガなどがないテーブルでも同様の結果になってしまいます。
sazi

2019/07/26 03:58 編集

質問の画像はどういった機能のスナップショットなんでしょうか? お聞きしたいのはファイル形式です。 フラットファイルといっても固定長だったりCSVとかTSVとかいろいろありますし。 文字区切り記号を使用されているものかどうかも気になります。
退会済みユーザー

退会済みユーザー

2019/07/26 04:02

フラットファイルデータを取り込み作成したテーブルのプロパティに記載されている画像になります。 よろしくお願いいたします。
sazi

2019/07/26 04:14

必要なのはフラットファイルのレイアウト情報です。
hihijiji

2019/07/26 04:50

諦めて BULK INSERT って選択肢はありますか?
退会済みユーザー

退会済みユーザー

2019/07/26 07:19

sazi様 失礼いたしました。 質問を更新しましたのでご確認ください。 hihijiji様 その方法は存じていませんが、一度調べてみます。 ありがとうございます。
sazi

2019/07/26 07:27

固定長ですか? サンプルのデータだと以下の様になってますか? 100001151180025RS2 それとも 10000115,1,180025RS,2 のように入っていますか?
hihijiji

2019/07/26 07:29

書いてある内容にいくつか矛盾があるので、該当テーブルのCREATE TABLE文を質問欄にさらしてください。 SSMSからなら、オブジェクトエクスプローラで該当テーブルを右クリック [テーブルをスクリプト化]-[新規作成]-[新しいクエリエディタウィンド]で CREATE TABLE文が出力されます。 そこから、出しちゃまずい部分を除いてコピペしてください。
退会済みユーザー

退会済みユーザー

2019/07/26 07:48

sazi様 column3のみ可変長です。 サンプルのデータは10000115,1,180025RS,2になります。 hihijiji様 CREATE TABLE文を記載しています。 ご確認ください。
guest

回答2

0

ベストアンサー

とりあえず、サイズ違いの固定長カラム(char(10))は避けましょう。
百害あって一利なしです。
サイズを合わせるか可変長にしましょう。

投稿2019/07/26 08:29

hihijiji

総合スコア4152

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

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

退会済みユーザー

退会済みユーザー

2019/07/26 08:43

hihijiji様 ご回答ありがとうございます。 ご指摘通り、可変長(nvarchar)に統一します。 NULLになる変わる箇所が分かりました。 --- column1: 数字のみの場合=正常に読み込み 先頭が英字大文字の場合(例:F0000049)=NULL こちら解決策はありますでしょうか?
hihijiji

2019/07/26 08:57

ロケール-文字コードの間違いですね 数字とアルファベットだけなら、ASCIIはShift-JISでも読めるはずですから フラットファイルソースの設定で ロケール:日本語(日本) コードページ:932(ANSI/OEM - 日本語 Shift-JIS) の設定で読めるはずです。
hihijiji

2019/07/26 09:11

Unicodeのチェックも外してください。
退会済みユーザー

退会済みユーザー

2019/07/26 09:21

hihijiji様 詳細なご回答いつもありがとうございます。 大変恐縮ですが、初歩的な質問をさせてください。 hihijiji様のインポート方法は「SQL Server インポートおよびエクスポート ウィザード」での方法でしょうか? SSMS上での テーブル→タスク→フラットファイルからのインポート から取り込みを行っており、 ロケール:日本語(日本)、コードページ:932(ANSI/OEM - 日本語 Shift-JIS)を選択する箇所がございません。 アドバイスをいただくことはできますでしょうか 何卒宜しくお願い致します。
hihijiji

2019/07/26 09:31

> 「SQL Server インポートおよびエクスポート ウィザード」での方法でしょうか? そうです。
hihijiji

2019/07/26 09:35

> タスク→フラットファイルからのインポート 今触ってみましたが、設定項目が少なすぎて日本のロケールでそのまま使うのは難しそうですね
退会済みユーザー

退会済みユーザー

2019/07/26 10:11

hihijiji様 回答ありがとうございます。 設定が少ないんですよね、、 データを分割して、インポートするとNULLに変わりません。 非常に手間ですが データ量の問題も考えられるのでしょうか?
hihijiji

2019/07/26 10:23

174MByte程度では普通は問題になりません。 その程度で不具合が出るなら他にも潜在的な問題を抱えていそうです。 マルチバイトを意識してない作りなので、それの利用は控えたほうがいいでしょう。 SQL Server インポートおよびエクスポート ウィザード 又は Bulk Insert を使うことをお勧めします。
guest

0

取り敢えず、全て文字型(nvarchar)のテーブルを作成してインポートしてみて下さい。
エラーにならないなら、そこにnot null 制約を追加したものに対して再度インポートを。

2つ目の手順でエラーとなる場合には、not null制約に関して、テーブルの定義とデータがあっていないという事です。

投稿2019/07/26 07:58

sazi

総合スコア25430

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

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

退会済みユーザー

退会済みユーザー

2019/07/26 08:41

sazi様 ご回答ありがとうございます。 NULLになる変わる箇所が分かりました。 --- column1: 数字のみの場合=正常に読み込み 先頭が英字大文字の場合(例:F0000049)=NULL →こちら解決策はありますでしょうか?
sazi

2019/07/26 08:44

テーブルの定義が数値型になっているんじゃないですか?
退会済みユーザー

退会済みユーザー

2019/07/26 10:13

sazi様 回答ありがとうございます。 取り込みを行う際の設定が少なく、定義をすることができません。 SSMS上での テーブル→タスク→フラットファイルからのインポート から取り込みを行っています。 データを分割すると、インポートするとNULLに変わりません。 非常に手間なのですが データ量の問題も考えられるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問