代码改变世界

T-SQL 一段没什么用的代码

  Nana's Lich  阅读(510)  评论(0编辑  收藏  举报

今天做了一些关于SQL Server的测试……折腾几圈下来之后自增量id就惨不忍睹了……于是东搜搜西查查拼凑出来这么一段东西,测试几次没发现严重问题,可以拿来重置表中的自增量id。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
declare @p_tablename nvarchar(128);
set @p_tablename = 'Table_1';
 
 
declare @seed numeric(38),
        @incr numeric(38),
        @last numeric(38),
        @vmax numeric(38),
        @cname nvarchar(128),
        @sql  nvarchar(max);
declare @tmax table(cmax numeric(38));
 
 
select
    @seed = cast(seed_value as numeric(38)),
    @incr = cast(increment_value as numeric(38)),
    @last = cast(last_value as numeric(38)),
    @cname = "name"
from sys.identity_columns
where object_name(object_id) = @p_tablename;
 
set @sql = 'select max("' + @cname
  + '") from ' + quotename(@p_tablename);
insert into @tmax
exec(@sql);
select @vmax = cmax from @tmax;
 
set @vmax = case when @vmax is null
then @seed - @incr
else floor((@vmax - @seed) / @incr) * @incr + @seed
end;
 
dbcc checkident(@p_tablename, reseed, @vmax);

这段代码会寻找指定数据表的自增量id列,然后根据这列中存在的最大数值来设置合适的“下一个”。

我在设计这段代码的时候考虑了两种特殊情况:

一种是列中的最大数值和初始值、增量并不对齐的情况——在这种情况下它会使用最小的有效且对齐的自增量id;

另一种情况则是当表中所有记录都被清空的时候——在元数据中,新建的表的“上一个自增量”的值是NULL,也就是未初始化的意思,但在我的测试中,使用DBCC命令似乎不能设置NULL……所以这里使用了一个迂回的办法,就是用设计上的初始值减去增量,这样当插入下一条记录的时候新产生的自增量值正好是设计上的初始值。

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示