コンテンツにスキップ

データ取り込みの詳細

このページでは、データ取り込み 機能が入力シートの内容から SQL を生成する際の規則と、データ型・DB種類ごとに実際どのような値が受け付けられ、どのような値がエラーになるかを詳しく説明します。

  • SQL の予約語(INSERT、UPDATE、WHERE 等)は大文字で表記されます
  • テーブル名・項目名は定義された物理名の通りに表記されます
  • 読みやすい位置で改行し、適切なインデントが加えられます(インデント幅は データ取り込みダイアログ で設定可能)
  • スキーマに対応する DB 種類(SQL Server/PostgreSQL/Oracle)では、テーブル名がスキーマ名で修飾されます
  • テーブル名・項目名にスペースや予約語が含まれる場合は、DB種類ごとの識別子クォート([ ] / " " / ` ` 等)で囲まれます
  • UPDATE 文でキー項目を変更することはできません(主キーの値を変更する場合は DELETE と INSERT を個別に実行してください)

データ取り込みダイアログ の「INSERT文1行当たりの項目数」「INSERT文のスタイル」の組み合わせにより、生成される SQL の見た目(括弧やカンマの位置)が変わります。

■ 生成される文例(INSERT文):

-- 1行あたり1項目、スタイル1(項目ブロック、値ブロックの前後に()を記入)
INSERT INTO table1
( field1,
field2,
field3 )
VALUES
( value1,
value2,
value3 );
-- 1行あたり5項目、スタイル2(INSERT句、VALUES句の前後に()を記入)
INSERT INTO table1 (
field1, field2, field3, field4, field5
) VALUES (
value1, value2, value3, value4, value5
);

データ取り込みダイアログ の「UPDATE文スタイル」の選択により、生成される SQL の見た目(カンマの位置)が変わります。

■ 生成される文例(UPDATE文):

-- スタイル1(SET句を2行目先頭、項目設定後に「,」、WHERE句のAND/ORは第1条件の後方)
UPDATE table1
SET field1 = value1,
field2 = value2,
field3 = value3,
WHERE
key1 = keyvalue1 AND
key2 = keyvalue2;
-- スタイル3(SET句を1行目後方、項目設定前に「,」、WHERE句のAND/ORは2番目以降の条件の前方)
UPDATE table1 SET
field1 = value1
,field2 = value2
,field3 = value3
WHERE
key1 = keyvalue1
AND key2 = keyvalue2;

DB種類ごとに構文が異なるため、それぞれ最適な UPSERT 構文が生成されます。

DB種類使用される構文
SQL ServerMERGE INTO ... USING ... WHEN MATCHED / WHEN NOT MATCHED
OracleMERGE INTO ... USING ... WHEN MATCHED / WHEN NOT MATCHED
PostgreSQLINSERT ... ON CONFLICT (...) DO UPDATE SET
MySQL / MariaDBINSERT ... ON DUPLICATE KEY UPDATE
SQLiteINSERT ... ON CONFLICT (...) DO UPDATE SET

■ 生成される文例(SQL Server):
-- SQL ServerのUPSERT文例
MERGE INTO hr.departments AS T
USING (
SELECT
'OF0001' AS dept_id, '東京本社' AS dept_name, NULL AS parent_dept_id, '2022-04-01 09:00:00' AS created_at,
'system' AS created_by, '2026-04-01 10:15:00' AS updated_at, 'sys_administrator' AS updated_by
) AS S
ON (
T.dept_id = S.dept_id
)
WHEN MATCHED THEN
UPDATE SET
dept_name = S.dept_name,
parent_dept_id = S.parent_dept_id,
created_at = S.created_at,
created_by = S.created_by,
updated_at = S.updated_at,
updated_by = S.updated_by
WHEN NOT MATCHED THEN
INSERT (
dept_id, dept_name, parent_dept_id, created_at,
created_by, updated_at, updated_by
)
VALUES (
S.dept_id, S.dept_name, S.parent_dept_id, S.created_at,
S.created_by, S.updated_at, S.updated_by
);

■ 生成される文例(Oracle):

-- Oracle DBのUPSERT文例
MERGE INTO HR.DEPARTMENTS T
USING (
SELECT
'OF0001' AS DEPT_ID, '東京本社' AS DEPT_NAME, NULL AS PARENT_DEPT_ID, TO_DATE('2022-04-01 09:00:00', 'YYYY-MM-DD HH24:MI:SS') AS CREATED_AT,
'system' AS CREATED_BY, TO_DATE('2026-04-01 10:15:00', 'YYYY-MM-DD HH24:MI:SS') AS UPDATED_AT, 'sys_administrator' AS UPDATED_BY
FROM dual
) S
ON (
T.DEPT_ID = S.DEPT_ID
)
WHEN MATCHED THEN
UPDATE SET
T.DEPT_NAME = S.DEPT_NAME,
T.PARENT_DEPT_ID = S.PARENT_DEPT_ID,
T.CREATED_AT = S.CREATED_AT,
T.CREATED_BY = S.CREATED_BY,
T.UPDATED_AT = S.UPDATED_AT,
T.UPDATED_BY = S.UPDATED_BY
WHEN NOT MATCHED THEN
INSERT (
DEPT_ID, DEPT_NAME, PARENT_DEPT_ID, CREATED_AT,
CREATED_BY, UPDATED_AT, UPDATED_BY
)
VALUES (
S.DEPT_ID, S.DEPT_NAME, S.PARENT_DEPT_ID, S.CREATED_AT,
S.CREATED_BY, S.UPDATED_AT, S.UPDATED_BY
);

■ 生成される文例(PostgreSQL):

-- PostgreSQL DBのUPSERT文例
INSERT INTO hr.departments (
dept_id,
dept_name,
parent_dept_id,
created_at,
created_by,
updated_at,
updated_by
)
VALUES (
'OF0001',
'東京本社',
NULL,
'2022-04-01 09:00:00',
'system',
'2026-04-01 10:15:00',
'sys_administrator'
)
ON CONFLICT (dept_id)
DO UPDATE SET
dept_name = EXCLUDED.dept_name,
parent_dept_id = EXCLUDED.parent_dept_id,
created_at = EXCLUDED.created_at,
created_by = EXCLUDED.created_by,
updated_at = EXCLUDED.updated_at,
updated_by = EXCLUDED.updated_by;

■ 生成される文例(MySQL/MariaDB):

-- MySQL/MariaDB DBのUPSERT文例
INSERT INTO departments (
dept_id,
dept_name,
parent_dept_id,
created_at,
created_by,
updated_at,
updated_by
)
VALUES (
'OF0001',
'東京本社',
NULL,
'2022-04-01 09:00:00',
'system',
'2026-04-01 10:15:00',
'sys_administrator'
)
ON DUPLICATE KEY UPDATE
dept_name = VALUES(dept_name),
parent_dept_id = VALUES(parent_dept_id),
created_at = VALUES(created_at),
created_by = VALUES(created_by),
updated_at = VALUES(updated_at),
updated_by = VALUES(updated_by);

■ 生成される文例(SQLite):

-- SQLiteの文例
INSERT INTO departments (
dept_id,
dept_name,
parent_dept_id,
created_at,
created_by,
updated_at,
updated_by
) VALUES (
'OF0001',
'東京本社',
NULL,
'2022-04-01 09:00:00',
'system',
'2026-04-01 10:15:00',
'sys_administrator'
)
ON CONFLICT (dept_id)
DO UPDATE SET
dept_name = excluded.dept_name,
parent_dept_id = excluded.parent_dept_id,
created_at = excluded.created_at,
created_by = excluded.created_by,
updated_at = excluded.updated_at,
updated_by = excluded.updated_by;

文字列項目にシングルクォート・ダブルクォート・改行・バックスラッシュが含まれる場合、DB種類ごとに異なるエスケープが自動的に適用されます。
※入力シートでこれらの特殊文字を使用する場合は、セル値にこの規約に沿った入力を行う必要があります。

シングルクォート/ダブルクォート

Section titled “シングルクォート/ダブルクォート”
DB種類シングルクォートダブルクォート
SQL Server/ PostgreSQL/ MySQL/ MariaDB/ SQLite/ Oracle''でエスケープエスケープ不要("をそのまま記入可能)
DB種類バックスラッシュ改行特殊構文
SQL Serverエスケープ不要(「\」をそのまま記入可能)エスケープ不要(改行をそのまま記入可能)なし
PostgreSQLE’…’内で\n等を使用するエスケープ不要(改行をそのまま記入可能)E’…’
MySQL/ MariaDB\\でエスケープ\nが推奨されているなし
SQLiteエスケープ不要(「\」をそのまま記入可能)エスケープ不要(改行をそのまま記入可能)なし
Oracleエスケープ不要(「\」をそのまま記入可能)q[…]構文を用いるq[…]

※特殊構文とはバックスラッシュや改行コードを使用する際にそのDB特有の特殊構文内で指定を行う場合に用いる構文のことを指す。詳しくは以下のDB種類ごとの特殊文字のSQL文への適用例を参照すること。

DB種類ごとの特殊文字のSQL文への適用例

Section titled “DB種類ごとの特殊文字のSQL文への適用例”

以下にシングルクォート/ ダブルクォート/ バックスラッシュ/ 改行を含む文字時列を1つの文字列項目にセットするINSERT文の例をDB種類毎に例示します。文字列項目のセル値の入力の際に参照してください。

■ SQL Server

INSERT INTO MyTable (StringField1)
VALUES (
'He said "Hello".
I''m happy.
C:\temp\test
改行あり
次の行'
);
----
・シングルクォート → ''、・ダブルクォート → そのまま、・バックスラッシュ → そのまま、
・改行 → そのまま書ける

■ PostgreSQL

INSERT INTO MyTable (StringField1)
VALUES (
E'He said "Hello".
I''m happy.
C:\\temp\\test
改行あり
次の行'
);
----
・シングルクォート → ''、・ダブルクォート → そのまま、
・バックスラッシュ →E'...' を使うと \\ や \n が使える、・改行 → そのまま書ける

■ MySQL/ MariaDB

INSERT INTO MyTable (StringField1)
VALUES (
'He said "Hello".\nI''m happy.\nC:\\temp\\test\n改行あり\n次の行'
);
----
・シングルクォート → ''、・ダブルクォート → そのまま、・バックスラッシュ →\\、
・改行 → \n 推奨(そのままでも動くが非推奨)

■ SQLite

INSERT INTO MyTable (StringField1)
VALUES (
'He said "Hello".
I''m happy.
C:\temp\test
改行あり
次の行'
);
----
・シングルクォート → ''、・ダブルクォート → そのまま、・バックスラッシュ → そのまま、
・改行 → そのまま書ける

■ Oracle

INSERT INTO MyTable (StringField1)
VALUES (
q'[He said "Hello".
I'm happy.
C:\temp\test
改行あり
次の行]'
);
----
・シングルクォート → q'[...]' 内ならエスケープ不要、・ダブルクォート → そのまま、
・バックスラッシュ → そのまま、・改行 → q'[...]' 内なら書ける
指定したい内容入力方法
NULL入力対象マーク(*)を外す、または (null) / (NULL) と入力する
空文字列 ''セルを空白にする(スペースなどを入力しないこと)
文字列としての (null)先頭を \ でエスケープして \(null) と入力する

NULL・空文字列・文字列としての(null)の入力例

No説明
①セルに(null) / (NULL) が入力されている場合は項目にはNULLがセットされる。
②セルが空白であれば項目には空白(長さ0の文字列)がセットされる。(Oracleの場合NULLと空白は同値なので結果的にNUUがセットされる)
③入力対象行の*マークが外れるとその項目はSQL処理対象外となるためセルに指定されている値は無視させる。(INSERT文ではNULLがセットされる。UPDATE文ではSET句による値の設定対象外になる。)

パラメータ化クエリの生成と実行

Section titled “パラメータ化クエリの生成と実行”

データ取り込みダイアログ の「パラメータ化クエリを使用する」を ON にすると、SQL インジェクション対策として値をバインドパラメータとして渡す形式で SQL が生成・実行されます。

パラメータ化クエリを使用する場合はSQL文は単一の文ではなく、複数のSQL文から構成されるコードブロックとして実行されます。 またパラメータ化クエリの定義やコードブロックの記載方法はDB種類毎に異なります。
SQExcelはDB種類に応じてそれぞれの表記規則に則ったコードブロックを出力します。

以下にパラメータ化クエリによるINSERT文の生成例を示します。
■ SQL Server

BEGIN
DECLARE @p1 CHAR(6) ; -- dept_id
DECLARE @p2 NVARCHAR(100); -- dept_name
DECLARE @p3 DATETIME2 ; -- created_at
DECLARE @p4 VARCHAR(20) ; -- created_by
DECLARE @p5 DATETIME2 ; -- updated_at
DECLARE @p6 VARCHAR(20) ; -- updated_by
SET @p1 = N'OF0001';
SET @p2 = N'東京本社';
SET @p3 = '2022-04-01 09:00:00';
SET @p4 = N'system';
SET @p5 = '2026-04-01 10:15:00';
SET @p6 = N'sys_administrator';
INSERT INTO hr.departments (
dept_id, dept_name, parent_dept_id, created_at,
created_by, updated_at, updated_by
) VALUES (
@p1, @p2, NULL, @p3,
@p4, @p5, @p6
);
END;
GO;

■ PostgreSQL

DO $$
DECLARE
p1 CHAR(6) := 'OF0001'; -- dept_id
p2 TEXT := '東京本社'; -- dept_name
p3 TIMESTAMP := '2022-04-01 09:00:00'; -- created_at
p4 TEXT := 'system'; -- created_by
p5 TIMESTAMP := '2026-04-01 10:15:00'; -- updated_at
p6 TEXT := 'sys_administrator'; -- updated_by
BEGIN
INSERT INTO hr.departments (
dept_id, dept_name, parent_dept_id, created_at,
created_by, updated_at, updated_by
) VALUES (
p1, p2, NULL, p3::timestamp,
p4, p5::timestamp, p6
);
END $$;

■ MySQL/ MariaDB

SET @p1 = 'OF0001'; -- dept_id
SET @p2 = '東京本社'; -- dept_name
SET @p3 = '2022-04-01 09:00:00'; -- created_at
SET @p4 = 'system'; -- created_by
SET @p5 = '2026-04-01 10:15:00'; -- updated_at
SET @p6 = 'sys_administrator'; -- updated_by
INSERT INTO departments (
dept_id, dept_name, parent_dept_id, created_at,
created_by, updated_at, updated_by
) VALUES (
@p1, @p2, NULL, @p3,
@p4, @p5, @p6
);

■ SQLite

WITH params AS (
SELECT 'OF0001' AS p1, -- dept_id
'東京本社' AS p2, -- dept_name
'2022-04-01 09:00:00' AS p3, -- created_at
'system' AS p4, -- created_by
'2026-04-01 10:15:00' AS p5, -- updated_at
'sys_administrator' AS p6 -- updated_by
)
INSERT INTO departments (
dept_id, dept_name, parent_dept_id, created_at,
created_by, updated_at, updated_by
)
SELECT
p1, p2, NULL, p3,
p4, p5, p6
FROM params;

■ Oracle

DECLARE
p1 CHAR(6) := 'OF0001'; -- DEPT_ID
p2 NVARCHAR2(100) := '東京本社'; -- DEPT_NAME
p3 VARCHAR2(20) := '2022-04-01 09:00:00'; -- CREATED_AT
p4 VARCHAR2(20) := 'system'; -- CREATED_BY
p5 VARCHAR2(20) := '2026-04-01 10:15:00'; -- UPDATED_AT
p6 VARCHAR2(20) := 'sys_administrator'; -- UPDATED_BY
BEGIN
INSERT INTO HR.DEPARTMENTS (
DEPT_ID, DEPT_NAME, PARENT_DEPT_ID, CREATED_AT,
CREATED_BY, UPDATED_AT, UPDATED_BY
) VALUES (
p1, p2, NULL, TO_DATE(p3, 'YYYY-MM-DD HH24:MI:SS'),
p4, TO_DATE(p5, 'YYYY-MM-DD HH24:MI:SS'), p6
);
END;
/

※UPDATE文、INSERT or UPDATE(=UPSERT)文、DELETE文でのパラメータ化クエリ使用時に生成されるSQLについては、実際のご利用時に出力されるSQLをご参照ください。

パラメータ化クエリを使用する目的は、SQLインジェクション攻撃を完全に防御し、データベースの安全性を確保することです。また、処理の高速化という副次的なメリットもあります。
ただしSQExcelではパラメータ化クエリを使用せずに通常のリテラルSQLを生成する場合でも、最低限のSQLインジェクション対応を行っています。

リテラルSQLを使用する際にSQLインジェクション対応を行う場合は、シングルクォーテーションなどのSQL文の構造を変更して任意のコマンドを挿入する可能性のある文字や記号をエスケープする必要があります。SQExcelは入力シートのセル内にそのような文字を見つけると自動的にエスケープ処理を行い無害化します。

  • SQExcelの機能と入力シートを使用してDBに対してSQLインジェクション攻撃を行うことは実質的に不可能ですが、出力されたSQL文を編集して攻撃を行うことは可能です。また入力シートからもDB内のテーブル情報が読み取れるようになっています。SQExcelが取り扱う入力シートや出力されたSQL文は機密情報として必要なセキュリティ管理を行ってください。

パラメータ化クエリの使用・不使用により結果が異なる場合

Section titled “パラメータ化クエリの使用・不使用により結果が異なる場合”

重要なポイントとして、同じ入力値でも、パラメータ化クエリとリテラルSQLとで処理結果(成功/エラー)が異なる場合があります。これはパラメータバインド時にドライバ・SQExcel 側で型変換が行われるためで、SQExcel の仕様上の挙動です。

■ 代表的な例:

状況(データ型)リテラルSQLパラメータ化クエリ
整数型(TinyInt/SmallInt/Int)項目値に少数を与えた場合DB側で自動的に整数に丸められエラーにならない。型指定されたパラメータへの代入時にエラーになる。
日付型(Date/DateTime)項目値に区切り文字が不均一な日付文字列(例:2026/05-13)を与えた場合区切り文字が不均一な日付文字列(例:2026/05-13)はSQL実行時エラーパラメータ設定時に日付書式が自動調整されるためエラーにならない
UniqueIdentifier / Uuid(例:SQL Server)ハイフンなしのGUID文字列はSQL実行時エラーパラメータ変数へ設定する際にGUID形式へ自動整形されるためエラーにならない