关于输入序号的问题

guhuan 2004-04-24 01:20:06
我想实现的是:比如是序号,固定是6位(000001),输入不足6位时可在前面自动补0,输入记录时只需输入第一行,以后每行自动比前一行加1(即不输入序号时也会自动填入)。若插入了一行,比如在第五行前插入了一行,则第五行以后记录的序号自动加1,改为正确值。
...全文
78 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2004-05-02
  • 打赏
  • 举报
回复
--我测试不会哦

--测试
declare @t table(a char(6))
insert @t select '123'
union all select '12345'
union all select '123456'

--查询
select a,len(a),datalength(a) from @t

/*--测试结果
a
------ ----------- -----------
123 3 6
12345 5 6
123456 6 6

(所影响的行数为 3 行)

--*/
guhuan 2004-05-02
  • 打赏
  • 举报
回复
触发器中
update 表 set 序号=right('000000'+序号,6)
应改为update 表 set 序号=right('000000'+rtrim(序号),6)
因为在建表的时候我们设‘序号’为char(6),所以在输入不足六位时它会在值的右边自动补上足够的空格,所以在len(序号)<6时,它是够六位的,也就无法加0了
哈哈,这几天就弄这一个问题,有了一点小小的成就感,骄傲一下。

谢谢各位,谢谢邹建!!!!!!!!!!
zjcxc 元老 2004-05-02
  • 打赏
  • 举报
回复
如果你同时插入多条记录,不一定是所有插入的记录位数都不足6位号,所以要加一个判断嘛.
guhuan 2004-05-02
  • 打赏
  • 举报
回复
为什么要加 where len(序号)<6呢
zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复
当然只扫描插入的行
guhuan 2004-04-29
  • 打赏
  • 举报
回复
请大家告诉我上面问题的答案
guhuan 2004-04-28
  • 打赏
  • 举报
回复
select 1 from inserted where len(序号)<6 这一句是怎么执行的是扫描整个表还是只扫描你当前插入的那一行
zjcxc 元老 2004-04-27
  • 打赏
  • 举报
回复
--加一个触发器就行了.
create trigger tr_insert_update on 表
for insert,update
as
if exists(select 1 from inserted where len(序号)<6)
update 表 set 序号=right('000000'+序号,6)
where len(序号)<6
guhuan 2004-04-27
  • 打赏
  • 举报
回复
有一个问题还没有解决,就是在手工输入序号时,若输入不足六位是怎么自动在前面补0
guhuan 2004-04-25
  • 打赏
  • 举报
回复
谢谢各位,谢谢邹建,小的我一下看不懂,先看看
zjcxc 元老 2004-04-24
  • 打赏
  • 举报
回复
至于你说的在某行前插入,因为SQL不支持在指定行前插入,所以你要说明你插入的处理方式才行.
zjcxc 元老 2004-04-24
  • 打赏
  • 举报
回复
至于你说的在某行前插入,因为SQL不支持在指定行前插入,所以你要说明你插入的处理方式才行.
zjcxc 元老 2004-04-24
  • 打赏
  • 举报
回复
--下面演示了自动设置编号,和删除编号自动重新排序的功能.

--创建得到最大id的函数
create function f_getid()
returns char(6)
as
begin
declare @id char(6)
select @id=max(id) from tb
return(case when @id is null then '000001' else right(1000001+cast(@id as bigint),6) end)
end
go

--创建表
create table tb(id char(6) default dbo.f_getid() primary key,name varchar(10))
go

--创建触发器,在删除表中的记录时,自动更新记录的id(**如果不要此功能,则删除此触发器)
create trigger t_delete on tb
AFTER delete
as
declare @id bigint,@mid char(6)
select @mid=min(id),@id=cast(@mid as bigint)-1 from deleted
update tb set id=right(1000000+@id,6),@id=@id+1 where id>@mid
go

--插入记录测试
insert into tb(name) values('张三')
insert into tb(name) values('张四')
insert into tb(name) values('张五')
insert into tb(name) values('张六')
insert into tb(name) values('张七')
insert into tb(name) values('张八')
insert into tb(name) values('张九')
insert into tb(name) values('张十')

--显示插入的结果
select * from tb

--删除部分记录
delete from tb where name in('张五','张七','张八','张十')

--显示删除后的结果
select * from tb

--删除环境
drop table tb
drop function f_getid

/*--测试结果
id name
----------- ----------
1 张三
2 张四
3 张五
4 张六
5 张七
6 张八
7 张九
8 张十

(所影响的行数为 8 行)

id name
----------- ----------
1 张三
2 张四
3 张六
4 张九

(所影响的行数为 4 行)
--*/
zjcxc 元老 2004-04-24
  • 打赏
  • 举报
回复
--下面演示了自动设置编号,和删除编号自动重新排序的功能.

--创建得到最大id的函数
create function f_getid()
returns char(6)
as
begin
declare @id char(6)
select @id=max(id) from tb
return(case when @id is null then '000001' else right(1000001+cast(@id as bigint),6) end)
end
go

--创建表
create table tb(id char(6) default dbo.f_getid() primary key,name varchar(10))
go

--创建触发器,在删除表中的记录时,自动更新记录的id(**如果不要此功能,则删除此触发器)
create trigger t_delete on tb
AFTER delete
as
declare @id bigint,@mid char(6)
select @mid=min(id),@id=cast(@mid as bigint)-1 from deleted
update tb set id=right(1000000+@id,6),@id=@id+1 where id>@mid
go

--插入记录测试
insert into tb(name) values('张三')
insert into tb(name) values('张四')
insert into tb(name) values('张五')
insert into tb(name) values('张六')
insert into tb(name) values('张七')
insert into tb(name) values('张八')
insert into tb(name) values('张九')
insert into tb(name) values('张十')

--显示插入的结果
select * from tb

--删除部分记录
delete from tb where name in('张五','张七','张八','张十')

--显示删除后的结果
select * from tb

--删除环境
drop table tb
drop function f_getid

/*--测试结果
id name
----------- ----------
1 张三
2 张四
3 张五
4 张六
5 张七
6 张八
7 张九
8 张十

(所影响的行数为 8 行)

id name
----------- ----------
1 张三
2 张四
3 张六
4 张九

(所影响的行数为 4 行)
--*/
zjcxc 元老 2004-04-24
  • 打赏
  • 举报
回复
插入一行怎么判断? 你自己输入要插入的编号??????????????
whisht 2004-04-24
  • 打赏
  • 举报
回复
楼上几位没有考虑删除一行出现的情况,
建议用插入和删除两个触电发器
playyuer 2004-04-24
  • 打赏
  • 举报
回复
update T
set 序号 = right('000000' + cast(cast(序号 as int) + 1 as varchar),6)
where cast(序号 as int) >= 5
insert into T (序号) values('000004')
playyuer 2004-04-24
  • 打赏
  • 举报
回复
update T
set 序号 = right('000000' + cast(cast(序号 as int) + 1 as varchar),6)
where cast(序号 as int) >= 5
netcoder 2004-04-24
  • 打赏
  • 举报
回复
新增一自增的字段
alter table 表 add 标识字段 int identity(1,1)
netcoder 2004-04-24
  • 打赏
  • 举报
回复
使用自增属性的字段吧

企业管理器-〉你的数据库所在服务器-〉数据库-〉选择相应的数据库-〉选择表(如果没有就新建)-〉右键设计表-〉字符类型为int->下面标识选是-〉下面默认两项都是1-〉确定

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧