在SQL SERVER 2000中 如何使这样的ID C_0001 C_0002 C_0003 自增,当插入第四条记录的时候就是C_0004! 先谢谢大家!
解决方案 »
- 为什么我自己建的命名空间,在其它类中无法发现?
- streamWriter无法将数据写入文件中
- 页面上“继续添加”按钮的功能是怎么实现的?即一次输入完后并不马上提交,而是继续录入几次,最后再一起提交写入数据库。
- 高手帮忙
- 请问你们做B/S的什么地方用到了线程啊
- 请教个安全问题。
- 用户 'sa' 登录失败。求大神解决啊
- 关于重新建立工程的问题。
- 各大侠请进,为菜鸟解决几个小问题:)解决了就给分
- .net集成oauth2实现集中认证
- Server Application Unavailable( XP IIS 5.1 .Net 2.0)
- 动态创建的 Button, 怎么动态添加 OnClick 事件
建一触发器 插入后根据自增列值自动在ID列插入自定义值 如C_0003
SQL的自增种子都只能是int型的。这样的不支持。
然后调用,调用一次就增长一个,
用两个字段来实现
第一个字段char型第二个字段用int
这样就可以解决了。
工厂流水号的生成
1.用SQL函数生成自动流水号.
流水号格式为:'R'+日期年后二位+二位数月+'-'+二位数日期+自动编号
R0708-2001
R0708-2002
R0708-2003自定义函数如下:
注:CaiGouInfo为采购单表,CGID为采购单自动流水号CREATE function new_idr(@a datetime) returns varchar(50)
begin
---id为日期格式部分
declare @id varchar(50),@i int
select top 1 @id=CGID from CaiGouInfo where left(CGID,8)='R'+(left(convert(varchar(6),@a,12),4)+'-'+right(convert(varchar(6),@a,12),2)) order by CGID desc
--如果没找到该日期的流水号,则新增加一个流水号,即为当天的第一个流水号
if @@rowcount=0
return 'R'+(left(convert(varchar(6),@a,12),4)+'-'+right(convert(varchar(6),@a,12),2))+'01'
--如果存在该日期的流水号则在该流水的后二位自动编号上加1
set @i= rtrim(right(@id,2)) +1
set @id=rtrim(@i)
--转化流水号后二位为2位字符串
return 'R'+(left(convert(varchar(6),@a,12),4)+'-'+right(convert(varchar(6),@a,12),2))+right( '00'+@id ,2 )
end 调用
在数据表里的流水号字段写个默认值,则应该字段为自动流水号
default ([dbo].[new_idr](getdate()))2.C#代码生成
因为除自动编号为的键值是不确定的.不像日期格式是确定的6位.所以SQL 自动生成流水号比较麻烦.采用C#编码生成.
注:BJID是自动生成的报价单号,CustomerProRes是客户产品资料表
//报价单为客户代码+物料名称+自动编号,自动编号自动增长
string BJID =CustomerCode+WLName;
//查找表中报价单中左边的"客户代码+物料名称"字符串是否是当前的客户数据
//如果找不到则新增加该客户的第一笔产品报价资料
DataSet ds_bj = kbs.LQSelectTable("*", "CustomerProRes", "left(BJID,len(BJID)-3)='" + BJID + "'", "", "bjtb");
if (ds_bj.Tables["bjtb"].Rows.Count == 0)
BJID += "001";
else
{
//如果存在该产品的报价资料,则新增加一笔报价资料.
int AutoNo;
//读取该客户资料的最大编号
DataSet ds_bj2 = kbs.LQSelectTable("max(BJID) as maxbjid", "CustomerProRes", "left(BJID,len(BJID)-3)='" + BJID + "'", "", "bjtb2");
//取出该客户资料的最大编号的后两位自动编号,并加1
AutoNo =Convert.ToInt32(ds_bj2.Tables["bjtb2"].Rows[0][0].ToString().Substring(ds_bj2.Tables["bjtb2"].Rows[0][0].ToString().Length - 3)) + 1;
//最后两位自动编号转成两位字符串
if (AutoNo.ToString().Length == 1) BJID +="00"+AutoNo;
else
{
if (AutoNo.ToString().Length == 2) BJID += "0"+AutoNo;
else BJID += AutoNo;
}
}最后直接用insert到相对应的流水号字段即可
何必强求呢?
何必强求呢?
--------------
支持这个
create function test()
......
函数的作用是是出取现有ID除去前一部分,编号最大的加上一,再组合成你要的那种格式返回就可以了在你插入值时
insert test into (id,.....) values (test(),....)
就OK了
create table A
(
column_1 VARCHAR2(12),
column_2 VARCHAR2(12)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);---------- 1 序列 ----------
create sequence seq_ids
minvalue 1
maxvalue 9999
start with 1
increment by 1
nocache
order;
---------------------------------------- 2 触发器 ----------
CREATE OR REPLACE TRIGGER A_trigger
BEFORE INSERT ON A
FOR EACH ROW
DECLARE
nextid varchar2(8);
BEGIN
IF :NEW.column_1 IS NULL THEN
:NEW.column_1 := 'C_0001';
ELSE
SELECT seq_ids.nextval INTO nextid FROM sys.dual;
END IF;
:NEW.column_2 := nextid;
:NEW.column_1 := 'C_' || lpad(nextid, 4, '0');
END A_trigger;
------------------------------测试:
insert into A values('', '')第一次执行
C_0001 1
第二次执行
C_0001 1
C_0002 2
.......
以上是用Oracle做的,SQL Server不太会用,莫怪。
插完数据的时候:
select right('C_000'+convert(varchar(20),ID),6)
多谢!