SQL Server 2016中按插入顺序获取指定位置记录的方法咨询
SQL Server Excel导入与插入顺序相关问题解答
1. 无ORDER BY时显示顺序固定的原因
SQL Server官方明确不承诺无排序时的返回顺序,但你看到的固定顺序只是巧合:
- 如果表有聚簇索引,返回顺序通常是聚簇索引的物理存储顺序,若聚簇键的顺序刚好和插入顺序一致,就会呈现固定结果
- 堆表(无聚簇索引)的数据初始按插入顺序存在数据页,但一旦发生数据删除、页分裂等操作,顺序就会被打乱
- 查询优化器可能暂时选择了固定执行计划,但这不是永久保证,后续执行计划变更就会导致顺序变化
2. 导入Excel时添加自增主键的步骤
用SQL Server导入和导出向导时,直接配置自增列最稳妥:
- 走完数据源选择步骤后,到选择目标表和视图环节,点击目标表右侧的「编辑映射」
- 在映射对话框里,新增一列(比如叫
InsertOrderID),数据类型选int,勾选「标识」,设置标识种子为1、增量为1 - 确认映射后完成导入,每条记录会自动获得按插入顺序生成的自增ID
如果是导入后补加自增主键,执行以下SQL:
ALTER TABLE ImportedData ADD InsertOrderID INT IDENTITY(1,1) PRIMARY KEY;
⚠️ 注意:补加的ID顺序是当前数据的存储顺序,不一定和Excel里的原始插入顺序完全匹配,优先推荐导入时配置。
3. 虚拟排序条件的可靠性
ORDER BY 1:这里的1指代结果集的第一列,不是固定顺序的保证。如果第一列存在重复值,ROW_NUMBER()的编号顺序依然不确定;只有当第一列是唯一值时,顺序才会固定,但这和插入顺序无关。ROW_NUMBER() OVER(ORDER BY @n):用常量排序时,SQL Server会认为所有行的排序键相同,此时行号的分配完全由查询优化器随机决定,每次执行结果可能不同,绝对不可靠。
可靠的解决方案
只有通过自增主键才能稳定获取插入顺序,示例代码如下:
-- 获取第1条和第3条记录 SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(ORDER BY InsertOrderID) AS ord FROM ImportedData ) x WHERE ord IN (1, 3);
或者用OFFSET/FETCH语法:
SELECT * FROM ImportedData ORDER BY InsertOrderID OFFSET 0 ROWS FETCH NEXT 1 ROWS UNION ALL SELECT * FROM ImportedData ORDER BY InsertOrderID OFFSET 2 ROWS FETCH NEXT 1 ROWS;
内容的提问来源于stack exchange,提问作者Barnabeck
相关产品推荐
相关产品推荐

