SqlServer中把结果集放到到临时表的方法

在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种。
 
  一 . SELECT INTO
 
   1.  使用 select into 会自动生成临时表,不需要事先创建
 
   select * into #temp from sysobjects
 
   01.  把存储过程结果集 SELECT INTO 到临时表
 
   select * from #temp
 
   2.  如果当前会话中,已存在同名的临时表
 
   select * into #temp from sysobjects
 
  再次运行,则会报错提示 : 数据库中已存在名为  '%1 的对象。
 
   Msg 2714  Level 16  State 6  Line 2
 
   There is already an object named '#temp' in the database.
 
  在使用 select into 前,可以先做一下判断 :
 
   if OBJECT_ID 'tempdb..#temp'  is not null
 
   drop table #temp
 
   select * into #temp from sysobjects
 
   select * from #temp
 
   3.  利用 select into 生成一个空表
 
  如果要生成一个空的表结构,不包含任何数据,可以给定一个恒不等式如下 :
 
   select * into #temp from sysobjects where 1 2
 
   select * from #temp
 
  二 . INSERT INTO
 
   1.  使用 insert into ,需要先手动创建临时表
 
   1.1  保存从 select 语句中返回的结果集
 
   create table test_getdate c1 datetime
 
   insert into test_getdate select GETDATE ()
 
   select * from test_getdate
 
   1.2  保存从存储过程返回的结果集
 
   create table #helpuser
 
   UserName nvarchar 128 ),
 
   RoleName nvarchar 128 ),
 
   LoginName nvarchar 128 ),
 
   DefDBName nvarchar 128 ),
 
   DefSchemaName nvarchar 128 ),
 
   UserID smallint
 
   SID smallint
 
  )
 
   insert into #helpuser exec sp_helpuser
 
   select * from #helpuser
 
   1.3  保存从动态语句返回的结果集
 
   create table test_dbcc
 
   TraceFlag varchar 100 ),
 
   Status tinyint
 
   Global tinyint
 
   Session tinyint
 
  )
 
   insert into test_dbcc exec 'DBCC TRACESTATUS'
 
   select * from test_dbcc
 
  对于动态 SQL ,或者类似 DBCC 这种非常规的 SQL 语句,都可以通过这种方式来保存结果集。
 
   2.  不能嵌套使用 insert exec 语句
 
   2.1  下面这个例子,尝试保存 sp_help_job 的结果集到临时表,发生错误
 
   create table #JobInfo
 
   job_id uniqueidentifier
 
   originating_server nvarchar 128 ),
 
   name nvarchar 128 ),
 
   enabled tinyint
 
   description nvarchar 512 ),
 
   start_step_id int
 
   category nvarchar 128 ),
 
   owner nvarchar 128 ),
 
   notify_level_eventlog int
 
   notify_level_email int
 
   notify_level_netsend int
 
   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
 
   current_execution_status int
 
   current_execution_step nvarchar 128 ),
 
   current_retry_attempt int
 
   has_step int
 
   has_schedule int
 
   has_target int
 
   type 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
 
   An INSERT EXEC statement cannot be nested.
 
  展开错误信息中的存储过程 :
 
   exec sp_helptext sp_get_composite_job_info
 
  发现里面还有个 INSERT INTO…EXEC 的嵌套调用, SQL Server 在语法上不支持。
 
   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 首先到打开服务器选项 Ad Hoc Distributed Queries
 
   exec sp_configure 'show advanced options' 1
 
   RECONFIGURE
 
   GO
 
   exec sp_configure 'Ad Hoc Distributed Queries' 1
 
   RECONFIGURE
 
   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 ''''master'''' 3 '' '  AS a
在SQL Server,可以使用以下三种方法将数据插入到表: 1. 插入到一个不存在的表: 可以使用以下语句将一个表的数据插入到一个新创建的表: ``` select * into new_table from test_table; ``` 这条语句会创建一个名为new_table的表,并将test_table的数据复制到新表。 2. 插入到临时表里面: 可以使用以下语句将一个表的部分数据(例如前100条)插入到临时表: ``` select top 100 * into #tmp_table from test_table; ``` 这条语句会创建一个名为#tmp_table的临时表,并将test_table的前100条数据复制到临时表。 3. 插入到一个已经存在的数据表: 可以使用以下语句将一个表的数据插入到另一个已经存在的表: ``` insert into test_02 select * from test_01; ``` 这条语句将test_01表的数据插入到test_02表。注意,目标表test_02必须已经存在,并且与源表test_01具有相同的列结构。 这些是插入数据到表的常见方法,在SQL Server可以根据具体需求选择适合的方法来插入数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SQL Server 把查询的数据放入表(临时表、已存在的表、新建的表)](https://blog.csdn.net/Dina_p/article/details/108263308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值