T-SQL——关于将有序数据插入临时表

shanzm-2024年7月30日

0.背景

  • 问题:需要将排序后的数据结果集插入到临时表中,少量数据发现没有任何问题,插入到临时表中的结果集保留了插入前的顺序。
    但是当待插入的临时表的结果集数据量足够大,可以发现插入后,临时表中的数据并没有按照我们期待的那样,保留插入前的排序

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



1. 解决方案1:使用ROW_NUMBER() OVER (ORDER BY…… )

DROP TABLE #result;

CREATE TABLE #result
(
    RowID INT NULL,
    Id INT NULL,
    Name NVARCHAR(100) NULL,
);

INSERT INTO #result
SELECT ROW_NUMBER() OVER (ORDER BY b.CreatedTime DESC) RowID,--指定需要的排序方式
       Id,
       Name,
       CreatedTime,

FROM
XXX_Table


2.解决方案2:给临时表创建聚集索引

CREATE TABLE #result
(
    Id INT NOT NULL,
    Name NVARCHAR(100) ,
    CreateTime DATETIME 
);

CREATE CLUSTERED INDEX IDX_#tables_CreateTime ON #result (CreateTime DESC);


INSERT INTO #result
SELECT Id,
       Name,
       CreatedTime
FROM XXX_Table
ORDER BY CreatedTime DESC;

SELECT *
FROM #result;



3.参考

posted @ 2024-07-30 10:04  shanzm  阅读(49)  评论(0编辑  收藏  举报
TOP