关于一个SQL语句的问题

softdream 2011-10-10 10:33:06
有一个表 archjzprj,其中有一个字段 “abc”,abc字段中存储的数据都是如“I11-123”“E50-001”样式的。字符串。
前三位为标识符,后三位为当前标识符在表中的顺序号。

当有一个标识符(有可能表中已经有这个标识符了,也可能没有)添加到表中的时候,打算用SQL语句计算出当前标识符的顺序号。

当有一个标识符为“E51”(表中的状态是没有这个标识符加入过)加入时,用如下语句:
select isnull(max(cast (case charindex('-',substring(abc,charindex('-',abc)+1,len(abc)))
when 0 then substring(abc,charindex('-',abc)+1,len(abc)) else
substring(substring(abc,charindex('-',abc)+1,lenabc)),1,charindex('-',substring(abc,charindex('-',abc)+1,len(abc)))-1)
end as int)),0)+1 as iMax from ArchJzPrj where caseabc when '' then '' else substring(abc,1,charindex('-',abc)-1) end='E51'

这个时候,在SQL的分析器中,看到iMax的值是1.是正确的。
为什么我在delphi中用adoquery运行它时,同样的 语句得到的iMax的值是2?很奇怪。请教了。
...全文
50 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2011-10-11
  • 打赏
  • 举报
回复
建议用存储过程插入数据:
--创建例表
create table ArchJzPrj(abc varchar(20))
insert into ArchJzPrj select 'I11-123' union all select 'E50-001'
go
--创建存储过程
create procedure addrow
(@flg varchar(10))
as
begin
set @flg=@flg+'-'
if exists(select 1 from ArchJzPrj where abc like @flg+'%')
insert into ArchJzPrj
select @flg+right('00'+ltrim(convert(int,replace(abc,@flg,''))+1),3) from(
select MAX(abc)abc from ArchJzPrj where abc like @flg+'%'
)t
else
insert into ArchJzPrj select @flg +'001'
end
go
--调用存储过程插入
exec addrow 'E51'
select * from ArchJzPrj
/*
abc
--------------------
I11-123
E50-001
E51-001

(3 行受影响)
*/
exec addrow 'E50'
select * from ArchJzPrj
/*
abc
--------------------
I11-123
E50-001
E51-001
E50-002

(4 行受影响)
*/
go
drop table ArchJzPrj

rings2000 2011-10-10
  • 打赏
  • 举报
回复
楼上没错
--小F-- 2011-10-10
  • 打赏
  • 举报
回复
运行一次就是1 运行两次就是2
-晴天 2011-10-10
  • 打赏
  • 举报
回复
可惜的是,你的这段程序有语法错误.
-晴天 2011-10-10
  • 打赏
  • 举报
回复
因为它已经被你运行过一次了.

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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