SQL SERVER データベース SELECT INTO および INSERT INTO の使用法(テンポラリテーブルへのデータ挿入を含む)
SqlServerで結果セットを一時テーブルに格納する方法
<スパン I. SELECT INTO
1. select intoを使用すると、事前にテーブルを作成することなく、自動的にテンポラリテーブルが生成される
SELECT * IN #TEMP FROM SYSOBJECTS
01. プロシージャの結果セットをtempテーブルにSELECT INTO
select * from #temp
2. 現在のセッションに同名のテンポラリテーブルが既に存在する場合
select * into #temp from sysobjects
もう一度実行すると、'%1!' という名前のオブジェクトが存在しないというエラーが報告されます。
Msg 2714, Level 16, State 6, Line 2
データベースに'#temp'という名前のオブジェクトがすでに存在します。
select into を使う前に、少し判断してみましょう。
OBJECT_ID ('tempdb... #temp') が NULL でない場合。
テーブル #temp を削除します。
sysobjectsから#tempに*を選択します。
select * from #temp
3. select into を使用して空のテーブルを生成します。
データを含まない空の表構造を生成したい場合は、以下のように定数不等式を与えればよい。
select * into #temp from sysobjects where 1 = 2
select * from #temp
<スパン II. INSERT INTO
1. insert into を使用する場合、まず手動でテンポラリテーブルを作成する必要があります(テーブルが存在する必要があります)。
1.1 select文から返された結果セットを保存する
テーブル test_getdate (c1 datetime) を作成します。
test_getdate に挿入 select GETDATE()
select * from test_getdate
1.2 ストアドプロシージャから返された結果セットを保存する
テーブル #helpuser を作成します。
UserName nvarchar (128)。
RoleName nvarchar (128)は、その
LoginName nvarchar (128)。
DefDBName nvarchar (128)である。
DefSchemaName nvarchar (128)を使用します.
ユーザーID smallint
SID smallint
)
insert into #helpuser exec sp_helpuser
select * from #helpuser
1.3 ダイナミックステートメントから返された結果セットの保存
テーブルtest_dbccを作成します。
TraceFlag varchar (100)である。
ステータス(tinyint)
グローバルな小さな整数
セッション・タイニーイント
)
insert into test_dbcc exec ('DBCC TRACESTATUS')
select * from test_dbcc
動的SQLや、DBCCのような型にはまったSQL文の場合、このように結果セットを保存することができます。
2. insert exec ステートメントをネストすることはできません。
2.1 次の例では、sp_help_job の結果セットを一時テーブルに保存しようとすると、エラーが発生します。
テーブル #JobInfo を作成します。
job_id 一意な識別子です。
originating_server nvarchar (128)である。
name nvarchar (128)である。
有効なtinyint
説明文 nvarchar (512),のことです。
start_step_id int.
カテゴリ nvarchar (128)を指定します。
owner nvarchar (128)である。
notify_level_eventlog int.
notify_level_email intは、その
notify_level_netsend int, the
notify_level_page int ,
notify_email_operator nvarchar (128)
notify_netsend_operator nvarchar (128)を使用すると、その
notify_page_operator nvarchar (128)である。
delete_level int.
date_createdのdatetimeは、その
date_modified datetimeは
version_number int, その
last_run_date int
last_run_time int
last_run_outcome int
next_run_date int
next_run_time int
next_run_schedule_id int。
現在の実行状況(int)。
current_execution_step nvarchar (128)である。
現在のリトライの試行回数 int。
has_step int.
has_schedule int.
has_target int.
タイプ int
)
Insert into #JobInfo exec msdb..sp_help_job
エラーメッセージ:INSERT EXEC文はネストすることができません。
Msg 8164, Level 16, State 1, Procedure sp_get_composite_job_info, Line 72
INSERT EXEC 文を入れ子にすることはできません。
エラーメッセージにあるプロシージャを展開してください。
exec sp_helptext sp_get_composite_job_info
SQL Server が構文的にサポートしていない INSERT INTO...EXEC ネストされた呼び出しがもう 1 つ見つかりました。
INSERT INTO @xp_results
EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner, @job_id
2.2 この問題は、INSIDE SQL Server 2005で著者が述べているように、分散クエリを使用することで回避することができます。
(1) まず、サーバーオプションでアドホック分散クエリをオンにします。
exec sp_configure '詳細オプションの表示', 1
再コンフィグレーション
GO
exec sp_configure 'Ad Hoc Distributed Queries', 1
再コンフィグレーション
GO
(2) OPENROWSETでローカルマシンに接続し、プロシージャを実行し、結果セットを取得する。
Windows認証の利用
select * into #JobInfo_S1
from openrowset ('sqloledb', 'server = (local); trusted_connection = yes', 'exec msdb.dbo.sp_help_job')
select * from #JobInfo_S1
SQL Server 認証を使用する
SELECT * INTO #JobInfo_S2
FROM OPENROWSET ('SQLOLEDB', '127.0.0.1'; 'sa'; 'sa_password', 'exec msdb.dbo.sp_help_job')
SELECT * FROM #JobInfo_S2
これは、手動でテーブルを作成する必要がないように書かれており、insert execがネストできない問題を回避することができます。ほとんどすべてのSQL文が使用可能です。
-dbccを直接実行することはできません
SELECT a.* into #t
FROM OPENROWSET ('SQLOLEDB', '127.0.0.1'; 'sa'; 'sa_password')
'dbcc log (''master'', 3)') AS a
-- 少しだけ回避することができます
SELECT a.* into #t
FROM OPENROWSET ('SQLOLEDB', '127.0.0.1'; 'sa'; 'sa_password')
' exec (''DBCC LOG (''マスター'', 3)')' AS a
元記事へのリンクです。
関連
-
mysql reports Access denied; you need (at least one of) SUPER privilege(s) for this operation
-
ERROR 1046 (3D000)の解決策です。MySQLでアカウント削除時にデータベースが選択されない問題
-
解決方法 テーブルの定義が正しくありません。自動列は1つだけで、キーとして定義する必要があります。
-
解決策: テーブルの定義が正しくありません。
-
IEntityChangeTracker の複数のインスタンスからエンティティオブジェクトを参照できない場合の対処法
-
01. プロシージャの結果セットを持つ一時テーブルへのSELECT INTO
-
[Mac] sudo mongod コマンド、プロンプトコマンドが見つかりません。
-
ORA-06550 "の解決策。1 行目、7 列目"
-
ORA-30926: ソース・テーブルの安定した行のセットを取得できませんか?
-
MySqlエラー解析'where節'の未知の列'xxx'
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL - エラーです。executeQuery() でデータ操作ステートメントを発行できません。
-
親行が削除または更新できない: 外部キー制約に失敗 解決策
-
unixODBC:データソース名が見つからない、デフォルトドライバが指定されていないに関する質問
-
Hibernateでhibernate.propertiesが見つからない問題とデータベース方言の更新の問題
-
MySQLデータベースのクエリ機能を使用する際に、グループ関数の使用が無効である問題の解決方法
-
Postgresql でテーブル "t" の FROM 句の項目が見つからない。
-
MongoDBコマンド
-
は、GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
ORA-65096 無効な共通ユーザー名またはロール名
-
アプリケーションから DB2 SQL Error が報告され続けます。SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=4.17.29