求存储过程 或 函数!

meilian01 2004-11-10 01:39:15
我有一个表T1,只有一个字段NewCode,存放一个最新的编码!

达到这样的效果:

有传进一个参数,只有两个字符,字段有四个字符。

如传入的参数是:AK
表里的字段值是:AKBY
则想得到结果:AKBZ,如再有更新 结果便是:AKAA。且更新一个,将表中之前的数据全中删除!只保留最新的编码。

如传入的:AL
表里的字段值是:AKBY
则想得的结果是:ALAA,如再有更新 结果便是 ALAB.也是只保留最新的编码!且结果要传出!


总的说明:
如表中的字段值前两个字符是传入的字符一样,则将后两个字符按逢Z进位,如AZ->BA,BZ->CA
否则字段中前两个字符等于传入的字符,后两位从AA开始。

不知道这样有没说明,谢谢!
...全文
179 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
meilian01 2004-11-10
  • 打赏
  • 举报
回复
不好意思。:D

我再看看!
zjcxc 元老 2004-11-10
  • 打赏
  • 举报
回复
没看出有什么问题
zjcxc 元老 2004-11-10
  • 打赏
  • 举报
回复
--晕,今天怎么这么多人说不行,一定要我写测试代码测试证明行才服啊

--测试表的
create table T1(NewCode char(4))
go

--初步判断就只能这样理解
create proc p_process
@参数 varchar(2)
as
declare @NewCode varchar(10)
select @NewCode=@参数
+char((ascii(right(NewCode,1))-64)/26+ascii(right(NewCode,2)))
+char((ascii(right(NewCode,1))-64)%26+65)
from T1 where NewCode like @参数+'%'
if @@rowcount=0 --没有就插入
insert T1(NewCode) values(@参数+'AA')
else --有就更新,这样就保持只有一条了
update T1 set NewCode=@NewCode where NewCode like @参数+'%'
go

exec p_process 'AA'
exec p_process '01'
exec p_process '01'
exec p_process 'BB'
exec p_process 'BB'
exec p_process 'BB'
exec p_process 'AA'

select * from T1
go

--删除测试
drop table T1
drop proc p_process

/*--测试结果

NewCode
-------
AAAB
01AB
BBAC

(所影响的行数为 3 行)
--*/
meilian01 2004-11-10
  • 打赏
  • 举报
回复
to: zjcxc(邹建)

好像不太行,我的t1表里只能是最新的一条,四个字符的值。
结果也不对
zjcxc 元老 2004-11-10
  • 打赏
  • 举报
回复
--初步判断就只能这样理解
create proc p_process
@参数 varchar(2)
as
declare @NewCode varchar(10)
select @NewCode=@参数
+char((ascii(right(NewCode,1))-64)/26+ascii(right(NewCode,2)))
+char((ascii(right(NewCode,1))-64)%26+65)
from T1 where NewCode like @参数+'%'
if @@rowcount=0 --没有就插入
insert T1(NewCode) values(@参数+'AA')
else --有就更新,这样就保持只有一条了
update T1 set NewCode=@NewCode where NewCode like @参数+'%'
zjcxc 元老 2004-11-10
  • 打赏
  • 举报
回复
where NewCode like @参数+'%'
meilian01 2004-11-10
  • 打赏
  • 举报
回复
to: zjcxc(邹建)

这个表只存最新的编码,所以更改之后,把最新的放进去。以前的删掉就行了。

我只是把它作为一个临时表,存放最新的编码。省得每次要从资料表里去查找最新的编码,如此而已
meilian01 2004-11-10
  • 打赏
  • 举报
回复
to: victorycyz(中海)

不想再建表,后面的都已经行了,
只是在函数里面,我怎么不能查找表及删除表及更新表!

davorsuker39 2004-11-10
  • 打赏
  • 举报
回复
学习!
zjcxc 元老 2004-11-10
  • 打赏
  • 举报
回复
你的更新过程根本就没说清楚,叫人怎么写?
meilian01 2004-11-10
  • 打赏
  • 举报
回复
不行呀!这只是一个最后两位的转换过程,我还要从表中提数,及更新表。

以及判断是否前两位相同呀!
victorycyz 2004-11-10
  • 打赏
  • 举报
回复
不想用到麻烦的计算的话,你可以建一个辅助表:
id int , lbl char(2)
1 AA
2 AB
......
26 AZ
27 BA
......

这样,你的T1表中只存数字就行了。需要的时候再从上面的表里查找对应的字符串。
meilian01 2004-11-10
  • 打赏
  • 举报
回复
谢谢老大!

zjcxc 元老 2004-11-10
  • 打赏
  • 举报
回复
余下的你就调用那个函数去做你自己的处理吧.
zjcxc 元老 2004-11-10
  • 打赏
  • 举报
回复
--函数,实现 AA->AB,AZ->BA
create function f_char(
@str varchar(10)
)returns varchar(10)
as
begin
return(
left(@str,len(@str)-2)
+char((ascii(right(@str,1))-64)/26+ascii(right(@str,2)))
+char((ascii(right(@str,1))-64)%26+65))
end
go

--调用
select dbo.f_char('AKBZ'),dbo.f_char('AKBY'),dbo.f_char('AY')
go

--删除测试
drop function f_char

/*--测试结果

---------- ---------- ----------
AKCA AKBZ AZ

(所影响的行数为 1 行)
--*/
meilian01 2004-11-10
  • 打赏
  • 举报
回复
是的,只保留一条记录!

不会超过ZZ的。

其实我前面两位是根据年份与月份得到的数据,2004年用A表示,2005年用B表示。

一月用A表示,二月用B表示。前面两位在程序中已求出。
lsxaa 2004-11-10
  • 打赏
  • 举报
回复
楼主你把处理过程再说清楚一点...

davorsuker39 2004-11-10
  • 打赏
  • 举报
回复
学习,顶
victorycyz 2004-11-10
  • 打赏
  • 举报
回复
则想得到结果:AKBZ,如再有更新 结果便是:AKAA。且更新一个,将表中之前的数据全中删除!只保留最新的编码。
------------------------------

数据全部删除吗?那是不是意味着表中始终只有一条记录?


如果查到表中的值后两位为ZZ呢?怎么处理?
lsxaa 2004-11-10
  • 打赏
  • 举报
回复
用 substring 和 charindex 可以实现
加载更多回复(1)

34,591

社区成员

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

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