SQL SERVER 临时表的排序问题

在SQL SERVER 2005/2008中,如果将有序的记录插入临时表,则从临时表查询出来的记录是有序的(不依赖ORDER BY也是有序状态),但是从SQL SERVER 2012开始,即使插入的记录集有序,查询出来的结果变成无序了。需要依赖ORDER BY来或得到一个有序结果。例如下面例子:

SELECT * INTO #tables FROM sys.tables ORDER BY name;
 

SELECT * FROM #tables;

如上所示,SQL SERVER 2014则是无序状态,我很是奇怪怎么从SQL SERVER 2012就开始变成无序了,这对我们来说犹如一个黑盒子,只知道结果集出现了变化,但是不知道内部啥变化导致这个现象出现。Records not sorted in the table when using ORDER BY clause to insert data into Temp Table 官方论坛对这个问题的描述如下:

如果有特殊的需要,要求临时表里面的数据有序,则可以通过创建聚集索引来解决这个问题。如下所示:

SELECT * INTO #tables FROM sys.tables WHERE 1= 0;
 

CREATE CLUSTERED INDEX IDX_#tables_NAME ON #tables(name);

 

INSERT INTO  #tables SELECT * FROM  sys.tables ORDER BY name;

 

SELECT * FROM #tables;

时间: 2024-10-18 03:23:15

SQL SERVER 临时表的排序问题的相关文章

当 IDENTITY_INSERT 设置为 OFF 时,不能向表 '#TT' 中的标识列插入显式值。 sql server 临时表

当 IDENTITY_INSERT 设置为 OFF 时,不能向表 '#TT' 中的标识列插入显式值.我是在SqlServer写存储过程中遇到的这个错误,当时就心想:临时表怎么会有主键呢,我也没有设置主键.然后我就和同事一块调试,终于发现了.原因就是我把真实的数据表中id(其实就是主键)取出来放到临时表(#TT)中,一开始是以为把主键的属性取出来了.后来又一起调试,发现不是那么回事,1.原来SqlServer会自动给临时表设置主键,如果你要插入数据的话,还要打开主键,这样你才能插入数据.“当 ID

SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨

SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢?下面罗列了一些导致重编译(recompile)的条件:     - 对查询所引用的表或视图进行更改(ALTER TABLE 和 ALTER VIEW).     - 对执行计划所使用的任何索引进行更改.     - 对执行计划所使用的统计信息进行更新,这些更新可能是从语句(如 UPDATE STA

SQL Server临时表 实用大全

我们今天是要和大家一起讨论的是SQL Server临时表的实用大全,如果你对SQL Server临时表的实用大全不是很了解的话,下面的文章就是对其相关内容的具体介绍,希望会给你带来一些帮助在此方面. 引子: 临时数据表格,我们在存储的时候经常遇见. 客户端可以实用Delphi的ClientDataSet的内存表,但是ClientDataSet类似TABLE,不是支持SQL语言的. 当然也可以实用临时表.有时我们避免SQL Server临时表的生命周期的麻烦,更多的使用实际表临时用用.起个什么te

SQL server 临时表

创建临时表,#代表局部临时表,##代表全局临时表.局部临时表和全局临时表的具体含义是什么呢? 举例说明一下比较清晰些,先来看下局部临时表,[新建查询],在里面输入如下文本: 运行后,我们在此文件执行输入: select * from #tempTable, 执行后可以查询出如下的数据: 我们另外打开一个[新建查询],就给其命名为新建查询2,在新建查询2中执行输入: select * from #tempTable,提示如下:   修改Sql 语句中的#tempTable 为 ##tempTabl

SQL Server 临时表 Vs 表变量

开始 说临时表和表变量,这是一个古老的话题,我们在网上也找到很多的资料阐述两者的特征,优点与缺点.这里我们在SQL Server 2005\SQL Server 2008版本上通过举例子,说明临时表和表变量两者的一些特征,让我们对临时表和表变量有进一步的认识.在本章中,我们将从下面几个方面去进行描述,对其中的一些特征举例子说明: 约束(Constraint) 索引(Index) I/0开销 作用域(scope) 存儲位置 其他 例子描述 约束(Constraint) 在临时表和表变量,都可以创建

SQL SERVER临时表的使用

drop table #Tmp   --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp(    ID   int IDENTITY (1,1)     not null, --创建列ID,并且每次新增一条记录就会加1    WokNo                varchar(50),       primary key (ID)      --定义ID为临时表#Tmp的主键      );Select * from #Tmp    --查询临时表的数据trun

小记sql server临时表与表变量的区别

临时表与表变量都可以起到“临时”的作用,那么两者主要的区别是什么呢? 这里不讨论创建方式,以及全局临时表.会话临时表这些,主要记录一下个人对两者的主要区别以及适用情况的看法,有什么不对或补充的地方,欢迎讨论. 区别: 1. 表变量存储在内存中,当创建表变量时,sql server不会产生日志,也不会维护统计信息:表变量的字段不能建立索引:不能有约束和默认值.sql server 认为表变量通常只有很少量的数据. 2. 当创建临时表时,sql server会产生日志,统计信息:临时表的字段可以建立

Atitit.mysql oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server..

Atitit.mysql  oracle with as模式临时表模式 CTE 语句的使用,减少子查询的结构性 mssql sql server.. 1. with ... as (...) 在mysql中应该如何表示 1 2. 子查询和查询嵌套主要是便于可读性提升上, 2 3. MYSQL中的解决之道::临时表. 2 4. Seo黑头关键字替换链接的统计样品 2 4.1. //---------查询com网站的数量 2 4.2. //----------------------查询net网站的

SQL Server 中本地(局部)临时表

一个SSMS查询窗口就是一个会话 通过本地临时表验证: 本地临时表仅在当前会话中可见:全局临时表在所有会话中都可见.本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name). 打开一个查询窗口,新建本地临时表,插入数据,并查询 create table #temptable (id int identity(1,1) primary key, name nvarchar(10) null); go insert into #t