1. ホーム
  2. データベース

SQL SERVER データベース SELECT INTO および INSERT INTO の使用法(テンポラリテーブルへのデータ挿入を含む)

2022-02-09 18:12:32

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


元記事へのリンクです。