SQL Serverで一時テーブルにIDENTITYフィールドを作成しながら挿入する方法
SQL Serverで一時テーブルにIDENTITYフィールドを作成しながら挿入する方法
方法1:INSERT INTO ... SELECT...構文を使用する
この方法は、SELECTステートメントの結果に基づいて一時テーブルを作成し、IDENTITYフィールドを自動的に生成します。
-- 一時テーブルを作成
DECLARE @TempTable TABLE (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
)
-- データを挿入
INSERT INTO @TempTable (Name)
SELECT 'John Doe'
-- 結果を確認
SELECT * FROM @TempTable
方法2:EXEC sp_executesqlを使用する
DECLARE @SQL NVARCHAR(MAX)
-- 動的SQLクエリを生成
SET @SQL = '
CREATE TABLE #TempTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
)
INSERT INTO #TempTable (Name)
VALUES (@Name)
SELECT * FROM #TempTable
'
-- 動的SQLクエリを実行
EXEC sp_executesql @SQL, N'@Name VARCHAR(50)', @Name = 'Jane Doe'
どちらの方法も、事前に一時テーブルを宣言する必要がなく、IDENTITYフィールドを自動的に生成できます。
方法1は、SELECTステートメントの結果に基づいて一時テーブルを作成する場合に適しています。
方法2は、動的にSQLクエリを生成して実行する場合に適しています。
注意事項
- 一時テーブルは、セッションが終了すると自動的に削除されます。
- IDENTITYフィールドの開始値と増分値は、上記の方法で変更できます。
- 詳細については、SQL Serverのドキュメントを参照してください。
-- 一時テーブルを作成
DECLARE @TempTable TABLE (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
)
-- データを挿入
INSERT INTO @TempTable (Name)
VALUES ('John Doe'), ('Jane Doe')
-- 結果を確認
SELECT * FROM @TempTable
DECLARE @SQL NVARCHAR(MAX)
-- 動的SQLクエリを生成
SET @SQL = '
CREATE TABLE #TempTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
)
INSERT INTO #TempTable (Name)
VALUES (@Name)
SELECT * FROM #TempTable
'
-- 動的SQLクエリを実行
EXEC sp_executesql @SQL, N'@Name VARCHAR(50)', @Name = 'John Doe'
EXEC sp_executesql @SQL, N'@Name VARCHAR(50)', @Name = 'Jane Doe'
出力例
ID Name
---- ----
1 John Doe
2 Jane Doe
このサンプルコードは、SQL Server 2017で動作確認しています。
上記以外にも、一時テーブルにIDENTITYフィールドを作成しながら挿入する方法があります。詳細は、SQL Serverのドキュメントを参照してください。
一時テーブルにIDENTITYフィールドを作成しながら挿入する他の方法
方法3:テーブル変数を使用する
テーブル変数は、一時テーブルと似たような機能を持つ変数です。テーブル変数を使用すると、事前に一時テーブルを宣言せずに、IDENTITYフィールドを含むテーブルを作成できます。
DECLARE @TempTable TABLE (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
)
INSERT INTO @TempTable (Name)
VALUES ('John Doe'), ('Jane Doe')
SELECT * FROM @TempTable
方法4:#tempテーブルを使用する
CREATE TABLE #TempTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
)
INSERT INTO #TempTable (Name)
VALUES ('John Doe'), ('Jane Doe')
SELECT * FROM #TempTable
SELECT *
INTO #TempTable
FROM (
SELECT 'John Doe' AS Name
UNION ALL
SELECT 'Jane Doe' AS Name
) AS T
SELECT * FROM #TempTable
方法1と2は、最も汎用性の高い方法です。
方法3と4は、一時テーブルを頻繁に使用する場合に便利です。
sql sql-server