SQLServer使用identity函数生成带有自增列临时表遇到的一个排序问题

本文探讨了在使用SQL的identity函数创建临时表时遇到的排序问题。通过实例展示当identity函数的别名与排序字段名相同时,会导致排序失效的情况,并给出了解决方案。

  今天在使用identity函数生成临时表的时候出现一个关于排序的问题.

select identity(int,1,1) myrow_id,billno
into #temp
from myTable
order by myTable.myrow_id

  我想按照myrow_id排序然后插入临时表#temp,并利用identity(int,1,1)函数生成行号列,结果#temp表里数据始终未能按照myrow_id排序。

  后来我想是不是由于identity(int,1,1)的别名和排序列名称重复,导致排序时sql把排序列当成了identity(int,1,1)呢?然后我把identity(int,1,1)的别名改为了id,问题解决,插入#temp中的结果集排序正常。

  结论:在使用identity函数生成临时表的时候,如果需要排序,那么identity的别名不能与排序列名称相同,否则排序失效。

### SQL Server 中设置表字段自动递增的方法 在 SQL Server 中,可以通过多种方式来实现表字段的自增功能。以下是几种常见的方式: #### 使用 `CREATE TABLE` 语句定义自增字段 当创建新表时,在定义字段属性时可以指定该字段为标识列(Identity Column),并设定初始值和增量。 ```sql CREATE TABLE ExampleTable ( Id INT IDENTITY(1, 1) PRIMARY KEY, Name NVARCHAR(50) ); ``` 这段代码表示新建名为 `ExampleTable` 的表格,并且其中有一个整数类型的 `Id` 列作为主键,它会从1开始按每次增加1来自动生成唯一编号[^1]。 对于已经存在的表,则无法直接修改现有非标识列成为标识列;如果确实需要这样做的话,通常建议先备份数据再重建整个结构或通过其他变通手段间接达到目的[^2]。 #### 获取当前最大自增值 为了获取某张特定表里最新的自增长数值,可利用内置函数 `IDENT_CURRENT()` 和 `IDENT_INCR()`. ```sql SELECT IDENT_CURRENT('tablename') + IDENT_INCR('tablename') AS newid; ``` 此查询返回下一次插入记录将会使用的ID号[^3]. #### 更新已有列使其变为连续递增序列 有时可能遇到这样的情况——希望将一张已有的表中的某一列调整成按照一定规律递增的形式。此时可以用如下方法构建辅助表来进行转换操作: ```sql -- 创建临时表存储新的顺序排列后的 id 及对应关系 WITH CTE AS (SELECT ROW_NUMBER() OVER (ORDER BY some_column) as rn,* FROM original_table_name) SELECT *,ROW_NUMBER() OVER () INTO temp_table FROM cte; UPDATE ot SET ot.id=tt.rn FROM original_table_name ot JOIN temp_table tt ON ot.some_unique_key = tt.some_unique_key ; DROP TABLE temp_table; -- 删除不再需要的中间过渡用表 ``` 这里假设 `original_table_name` 是要处理的目标表名称,“some_column”代表用来决定排序依据的一列而 “some_unique_key” 应替换为目标表内能唯一区分各行的数据项[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值