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

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

一. 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 2
There 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 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_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 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 

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

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

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

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

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

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

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

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

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

  5. MySQL实战 | 01 当执行一条 select 语句时,MySQL 到底做了啥?

    原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...

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

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

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

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

  8. 【云原生 | Kubernetes 实战】01、K8s-v1.25集群搭建和部署基于网页的 K8s 用户界面 Dashboard

    目录 一.K8s 概述 可以查看官方文档:概述 | Kubernetes 组件交互逻辑: 二.kubeadm 安装 K8s-v1.25高可用集群 k8s 环境规划: 1.初始化环境 2.安装 Dock ...

  9. mysql存储过程中使用select count(*) into 变量名 from +表+ where条件的用法

    select count(*) into v_count from dual where userid=2; 此语句的意思就是根据where条件查询dual表,得到的行数存入变量v_count中(给变 ...

最新文章

  1. 在CentOS 6.3 64bit上安装最新版tsar并监控ATS 5.3
  2. 【译】Angular 5 新特性
  3. matlab 比例谐振控制器,比例谐振控制的一种实现(含代码)
  4. PHP中常见的提示对照表
  5. Bootstrap3基础 下载bootstrap3压缩包和相应的jQuery文件
  6. TCP/IP协议读书笔记(1)
  7. C++编程(一):匈牙利命名法
  8. [HTA] - HTML应用程序
  9. Android动态切换主题
  10. fileservice 类代码放哪里_一步步开发Windows服务(Windows Service)[转]
  11. OSEK NM 功能测试
  12. 几个不知道算不算经典的游戏
  13. 快速迭代式开发使用方法总结
  14. vue NavigationDuplicated: Avoided redundant navigation to current location
  15. 关于微信在线客服系统的实现(已经证实可用)
  16. 用Matlab实现人脸 68 landmarks详细教程
  17. 向武 清华大学 计算机,哥哥保送弟弟全市第二 双胞胎同时上清华(组图)
  18. DOM算法系列002-寻找指定DOM节点的上一个或下一个节点
  19. Rabbitmq小书
  20. 01-如何选购CPU散热器?小白装机通俗易懂的水冷/风冷CPU散热器知识

热门文章

  1. SpringMVC系列(二): SpringMVC各个注解的使用
  2. 外联css及js的使用
  3. Mongodb python驱动教程
  4. 关于E1的一些扫盲资料
  5. 低版本浏览器支持css3 Media查询的方法, ie6-ie8 不支持css3 的时候用respond.js,html5shiv.js 【非常实用哦】。。。。。。。。。。。。...
  6. elasticsearch 复杂查询小记
  7. HTML中常用字符实体
  8. Directory lookup for the file xxx.mdf failed with the operating system error 2
  9. iBatis简单入门教程
  10. javascript编译与运行的几个实验