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

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

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

1 select * into #temp from sysobjects

再次运行,则会报错提示:数据库中已存在名为'%1!' 的对象。www.it165.net

Msg 2714, Level16, State 6, Line 2
There is alreadyan object named '#temp' in the database.

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

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

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

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

二. INSERT INTO

1. 使用insert into,需要先手动创建临时表
1.1 保存从select语句中返回的结果集
123 create table test_getdate(c1 datetime)
insert into test_getdate select GETDATE()
select * from test_getdate

1.2 保存从存储过程返回的结果集

123456789101112 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 保存从动态语句返回的结果集
123456789 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语句
下面这个例子,尝试保存sp_help_job的结果集到临时表,发生错误:

123456789101112131415161718192021222324252627282930313233343536 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, Level16, State 1, Procedure sp_get_composite_job_info, Line 72
An INSERT EXEC statement cannot benested.

展开错误信息中的存储过程:

1 exec sp_helptext sp_get_composite_job_info

发现里面还有个INSERT INTO…EXEC的嵌套调用,SQL Server在语法上不支持。

12 INSERT INTO @xp_results
EXECUTE master.dbo.xp_sqlagent_enum_jobs @can_see_all_running_jobs, @job_owner, @job_id

可以用分布式查询来避免这个问题,这种写法在INSIDE SQL Server 2005中作者提到过。
(1) 首先到打开服务器选项Ad Hoc Distributed Queries
123456 exec sp_configure 'show advanced options',1
RECONFIGURE
GO
exec sp_configure 'Ad Hoc Distributed Queries',1
RECONFIGURE
GO

(2) 通过OPENROWSET连接到本机,运行存储过程,取得结果集
使用windows认证
123 select * into #JobInfo_S1
from openrowset('sqloledb', 'server=(local);trusted_connection=yes','exec msdb.dbo.sp_help_job')
select * from #JobInfo_S1

使用SQLServer认证
123 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语句都可以使用。

12345678 --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. 把存储过程结果集SELECT INTO到临时表

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

  2. 转:把存储过程结果集SELECT INTO到临时表

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

  3. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除临时表(drop table #tableName)吗?

    本文出处:http://www.cnblogs.com/wy123/p/6704619.html 问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时 ...

  4. SELECT INTO创建临时表

    SELECT INTO创建临时表 SQL Server临时表有两种类型:本地和全局.它们在名称.可见性以及可用性上有区别.本地临时表的名称以单个数字符号 (#) 打头:它们仅对当前的用户连接是可见的: ...

  5. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

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

    在开发过程中,很多时候要把结果集存放到临时表中,常用的方法有两种. 一. SELECT INTO 1. 使用select into会自动生成临时表,不需要事先创建 select * into #tem ...

  7. 存储过程使用表变量或临时表代替游标Fetch实例,访问远程数据库

    定义表变量是可以直接操作在内存中的数据,比较快.临时表在大数据量时会比游标使用的资源少.还是要看具体情况了.也有可能在实际优化过程中相互替换呢. 留作记忆的代码如下: if object_id('te ...

  8. MYSQL 存储过程、函数、临时表、游标

    创建函数 因为我们平时经常需要创建不同日期的数据,以模拟的场景,覆盖更多的用例,所以这里写了一个返回随机日期的demo.大家可以自行扩展. DROP FUNCTION IF EXISTS milan_ ...

  9. 解决 FastReport 使用存储过程 找不到临时表问题

    在存储过程最开始加入:以下命令就可以了 SET FMTONLY OFF 有时候在执行SQL查询语句时,仅仅需要知道检索的元数据,而不是具体的数据行,可以设置SET FMTONLY ON. SET FM ...

随机推荐

  1. 这可能是最简明扼要的 js事件冒泡机制+阻止默认事件 讲解了

    哎 js事件冒泡机制和阻止冒泡 阻止默认行为好像永远也整不清楚,记了忘 忘了记...醉了 这篇文章写完以后下次再忘记 就呼自己一巴掌,忘一次一巴掌 首先要明白两个概念——事件和事件流 事件指的是用户或 ...

  2. Idea热部署jrebel失败

    Idea热部署jrebel

  3. linux page table entry struct

    Page Table Entry The access control information is held in the PTE and is CPU specific; figure bit f ...

  4. php json 解析有stdClass Object 解决办法

    php json 解析有stdClass Object mixed json_decode ( string $json [, bool $assoc = false [, int $depth = ...

  5. Spring MVC - 拦截器实现 和 用户登陆例子

    1.拦截器 SpringMvc中的拦截器实现了HandlerInterceptor接口,通常使用与身份认证,授权和校验,模板视图,统一处理等: public class HanderIntercept ...

  6. scanf格式化中的\n

    如果一个scanf的格式串以\n结尾,那么在读取完后还会阻塞等待,比如: int a; scanf("%d\n", &a); 这种情况,输入一个数字然后敲下回车后,程序还是 ...

  7. opencv-原图基础上添加指定颜色

    前言 项目中需要将某些区域使用不同的颜色表示出来,同时能够看到原图作为底色. 代码 #include "opencv2/highgui/highgui.hpp" #include ...

  8. opencv-python教程学习系列13-图像平滑

    前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍图像平滑,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统环境 系统: ...

  9. Mac OS 基于 VirtualEnv 的安装 tensorflow 1.3.0

    如果不行的话,就用conda装吧 https://www.jianshu.com/p/d54546ab315e 推荐使用 virtualenv 创建一个隔离的容器, 来安装 TensorFlow. 这 ...

  10. iFiles——苹果上最好用的文件管理器 - imsoft.cnblogs