在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种。

一. SELECT INTO 1. 使用select into会自动生成临时表,不需要事先创建

select * into #temp from sysobjects
select * from #temp

2. 如果当前会话中,已存在同名的临时表

select * into #temp from sysobjects

再次运行,则会报错提示:数据库中已存在名为 '%1!' 的对象。Msg 2714, Level 16, State 6, Line 2There is already an object named '#temp' in the database.

在使用select into前,可以先做一下判断:

if OBJECT_ID('tempdb..#temp') is not null
drop table #tempselect * into #temp from sysobjects
select * from #temp

3. 利用select into生成一个空表
如果要生成一个空的表结构,不包含任何数据,可以给定一个恒不等式如下:

select * into #temp from sysobjects where 1=2
select * from #temp

二. INSERT INTO1. 使用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_helpuserselect * 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 72An 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 

把存储过程结果集SELECT INTO到临时表相关推荐

  1. 01. 把存储过程结果集SELECT INTO到临时表

    原文:01. 把存储过程结果集SELECT INTO到临时表 在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种. 一. SELECT INTO 1. 使用select into会自动生 ...

  2. oracle 存储过程select into,01. 把存储过程结果集SELECT INTO到临时表(示例代码)

    原文:01. 把存储过程结果集SELECT INTO到临时表 在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种. 一. SELECT INTO 1. 使用select into会自动生 ...

  3. mysql 存储过程声明式游标_Mysql 存储过程中使用游标循环读取临时表

    游标 游标(Cursor)是用于查看或者处理结果集中的数据的一种方法.游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标的使用方式 定义游标:Declare 游标名称 CURSOR ...

  4. mysql存储过程into_MySQL存储过程中使用SELECT …INTO语句为变量赋值

    使用SELECT -INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT -INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量.SELECT -INTO语句 ...

  5. Sql Server 关于整表插入另一个表部分列的语法以及select 语句直接插入临时表的语法...

    语法是这样的 : 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1 <>1 法二:selec ...

  6. Sql Server 关于整表插入另一个表部分列的语法以及select 语句直接插入临时表的语法 (转帖)...

    语法是这样的 : 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1 <>1 法二:selec ...

  7. 存储过程mysql into select into_mysql 存储过程select into select into select的搜索结果-阿里云开发者社区...

    对一个MySQL存储过程的优化 在编写MySQL存储过程的过程中,我们会时不时地需要对某些存储过程进行优化,其目的是确保代码的可读性.正确性及运行性能.本文以作者实际工作为背景,介绍了对某一个MySQ ...

  8. mysql 临时表_第05问:MySQL 在处理临时结果集时,内部临时表会使用多少内存?...

    问题: MySQL 在处理临时结果集(UNION 运算 / 聚合运算等)时,会用到内部临时表(internal temporary table). 那么内部临时表会使用多少内存呢? 实验: 我们先创建 ...

  9. oracle 存储过程中使用select 列 into 变量

    在oracle存储过程中,有许多自己定义的变量,一般是需要赋值的,在这种情况下,一般来说,可以使用 select 列 into 变量  from table ,就是将列赋值给变量.

最新文章

  1. SqlServer修改数据库文件及日志文件存放位置
  2. [模拟退火]BZOJ 3680 吊打XXX
  3. python re库函数_python re库的正则表达式学习笔记
  4. Linux中文件上传rz使用
  5. 360隔离mysql恢复_MySQL备份与恢复
  6. 类加载器-启动类加载器
  7. 【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况
  8. 这是一场数学、数学、数学的盛会
  9. linux命令中tar后跟的zxvf是什么意思
  10. Git教程(二)-如何上传和同步自己的git项目
  11. 家里电脑是win10,但开机都要3分钟,请问怎么提快电脑速度?
  12. 大数据分析的误区有哪些
  13. MyBatis 动态SQL与SQL片段
  14. Visio 2019图文安装教程
  15. virtualxposed使用教程_VirtualXposed框架
  16. 怎样才能成为一名合格的数据分析师?
  17. 股市华为鸿蒙是什么意思,4月华为鸿蒙概念股市回顾数据(干货满满)
  18. winHex数据恢复(第一篇)
  19. ndows 资源管理器,windows资源管理器已停止工作怎么解决
  20. 【coq】函数语言设计 笔记 01 - basics

热门文章

  1. C++union 联合
  2. C++ Opengl 透明纹理源码
  3. 在Windows平台如何选择C语言编译器?
  4. c语言用hash方式数组去重,js数组去重的hash方法
  5. hive中存Array类型的数据的案例,将字符串的数组格式转成数组的字符串,自定义函数方式处理‘[12,23,23,34]‘字符串格式的数据为array<int>格式的数据。
  6. 01_MyBatis EHCache集成及所需jar包,ehcache.xml配置文件参数配置及mapper中的参数配置
  7. Mysql数据库,表,字符集,主外键等创建的sql模板
  8. 1线程概念:线程和进程之间的关系,线程间可共享资源,线程间非共享资源,线程的优缺点
  9. 4进程原语:fork()函数,getpid()函数和getppid()函数,getuid()函数,getgid()函数,vfork()
  10. 1Boost之TCP,Client and Server