SQL Server 2008でレコードの存在を確認し、存在しない場合は挿入する方法
SQL Server 2008でレコードの存在を確認し、存在しない場合は挿入する方法
SQL Server 2008で特定の条件に合致するレコードが存在するかどうかを確認し、存在しない場合は新しいレコードを挿入する方法について解説します。
方法
以下の3つの方法を紹介します。
- EXISTS キーワード
IF NOT EXISTS (SELECT * FROM テーブル名 WHERE 条件)
BEGIN
INSERT INTO テーブル名 (列名1, 列名2, ...) VALUES (値1, 値2, ...)
END
解説
EXISTS
キーワードは、サブクエリで指定された条件に合致するレコードが1件でも存在するかどうかを確認します。IF NOT EXISTS
は、レコードが存在しない場合のみ、INSERT
ステートメントを実行します。
例
社員
テーブルに、社員番号
が 12345
のレコードが存在するかどうかを確認し、存在しない場合は挿入する例です。
IF NOT EXISTS (SELECT * FROM 社員 WHERE 社員番号 = 12345)
BEGIN
INSERT INTO 社員 (社員番号, 氏名, 部署) VALUES (12345, '山田太郎', '営業部')
END
- MERGE ステートメント
MERGE INTO テーブル名 AS T
USING (SELECT * FROM 仮想テーブル) AS S
ON (T.列名 = S.列名)
WHEN MATCHED THEN
UPDATE SET ...
WHEN NOT MATCHED THEN
INSERT (列名1, 列名2, ...) VALUES (値1, 値2, ...)
MERGE
ステートメントは、UPDATE
とINSERT
をまとめて実行できます。
MERGE INTO 顧客 AS T
USING (SELECT * FROM (VALUES ('山田太郎', 30)) AS 仮想テーブル) AS S
ON (T.氏名 = S.氏名)
WHEN MATCHED THEN
UPDATE SET 年齢 = S.年齢
WHEN NOT MATCHED THEN
INSERT (氏名, 年齢) VALUES (S.氏名, S.年齢)
- TRY_CONVERT 関数
DECLARE @ID INT
SET @ID = TRY_CONVERT(INT, 列名)
IF @ID IS NULL
BEGIN
INSERT INTO テーブル名 (列名, ...) VALUES (値1, ...)
END
TRY_CONVERT
関数は、文字列を指定されたデータ型に変換しようとします。- 変換に失敗した場合、
NULL
が返されます。 @ID IS NULL
は、TRY_CONVERT
関数が変換に失敗した場合のみ、INSERT
ステートメントを実行します。
DECLARE @ID INT
SET @ID = TRY_CONVERT(INT, 商品コード)
IF @ID IS NULL
BEGIN
INSERT INTO 商品 (商品コード, 商品名, 価格) VALUES ('ABC123', '商品名', 1000)
END
上記の3つの方法いずれでも、レコードの存在を確認し、存在しない場合は挿入することができます。状況に応じて適切な方法を選択してください。
-- テーブルが存在しない場合は作成する
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '社員')
BEGIN
CREATE TABLE 社員 (
社員番号 INT NOT NULL PRIMARY KEY,
氏名 VARCHAR(50) NOT NULL,
部署 VARCHAR(50) NOT NULL
)
END
-- レコードが存在するかどうかを確認し、存在しない場合は挿入する
IF NOT EXISTS (SELECT * FROM 社員 WHERE 社員番号 = 12345)
BEGIN
INSERT INTO 社員 (社員番号, 氏名, 部署) VALUES (12345, '山田太郎', '営業部')
END
-- 仮想テーブルを作成する
CREATE TABLE #仮想テーブル (
氏名 VARCHAR(50) NOT NULL,
年齢 INT NOT NULL
)
-- 仮想テーブルにデータを追加する
INSERT INTO #仮想テーブル (氏名, 年齢) VALUES ('山田太郎', 30)
-- レコードが存在するかどうかを確認し、存在しない場合は挿入する
MERGE INTO 顧客 AS T
USING #仮想テーブル AS S
ON (T.氏名 = S.氏名)
WHEN MATCHED THEN
UPDATE SET 年齢 = S.年齢
WHEN NOT MATCHED THEN
INSERT (氏名, 年齢) VALUES (S.氏名, S.年齢)
-- 仮想テーブルを削除する
DROP TABLE #仮想テーブル
-- テーブルが存在しない場合は作成する
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '商品')
BEGIN
CREATE TABLE 商品 (
商品コード VARCHAR(50) NOT NULL PRIMARY KEY,
商品名 VARCHAR(50) NOT NULL,
価格 INT NOT NULL
)
END
-- レコードが存在するかどうかを確認し、存在しない場合は挿入する
DECLARE @ID INT
SET @ID = TRY_CONVERT(INT, 'ABC123')
IF @ID IS NULL
BEGIN
INSERT INTO 商品 (商品コード, 商品名, 価格) VALUES ('ABC123', '商品名', 1000)
END
補足
- 上記のサンプルコードは、あくまで基本的な例です。実際の使用例に合わせて、必要に応じて修正してください。
- エラー処理など、必要な処理を追加してください。
SQL Server 2008でレコードの存在を確認し、存在しない場合は挿入する方法
SELECT INTO ステートメント
SELECT * INTO 新しいテーブル名
FROM 旧テーブル名
WHERE 条件
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO 新しいテーブル名 (列名1, 列名2, ...) VALUES (値1, 値2, ...)
END
SELECT INTO
ステートメントは、SELECT
クエリの結果を新しいテーブルに挿入します。@@ROWCOUNT
は、SELECT
クエリで返された行数を示します。
SELECT * INTO 新しい社員
FROM 社員
WHERE 社員番号 = 12345
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO 新しい社員 (社員番号, 氏名, 部署) VALUES (12345, '山田太郎', '営業部')
END
INSERT INTO ... SELECT ステートメント
INSERT INTO テーブル名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM 仮想テーブル
WHERE NOT EXISTS (SELECT * FROM テーブル名 WHERE 条件)
INSERT INTO ... SELECT
ステートメントは、サブクエリで指定された結果を新しいレコードとして挿入します。
INSERT INTO 顧客 (氏名, 年齢)
SELECT 氏名, 年齢
FROM (VALUES ('山田太郎', 30)) AS 仮想テーブル
WHERE NOT EXISTS (SELECT * FROM 顧客 WHERE 氏名 = '山田太郎' AND 年齢 = 30)
DECLARE @ID INT
SET @ID = 1
WHILE @ID <= 100
BEGIN
IF NOT EXISTS (SELECT * FROM テーブル名 WHERE ID = @ID)
BEGIN
INSERT INTO テーブル名 (ID, ...) VALUES (@ID, ...)
END
SET @ID = @ID + 1
END
WHILE
ステートメントは、指定された条件が真である間、繰り返し処理を実行します。- 上記の例では、
ID
が1
から100
までの間、レコードが存在しない場合は挿入します。
DECLARE @ID INT
SET @ID = 1
WHILE @ID <= 100
BEGIN
IF NOT EXISTS (SELECT * FROM 商品 WHERE ID = @ID)
BEGIN
INSERT INTO 商品 (ID, 商品名, 価格) VALUES (@ID, '商品名', 1000)
END
SET @ID = @ID + 1
END
sql sql-server sql-server-2008