日期:2014-05-17  浏览次数:20558 次

SQL2008插入自动生成的默认值,格式为:A-3J01-201401231705-001
SQLSever2008插入自动生成的默认值,格式为:AA-3J01-201401231705-001
往表a中字段单号NO插入上面的格式数据,
AA-3J01是另外一个表b中的CK、KW两个字段,201401231705是时间,001是序号代表第几份。
也就是:
表a:
bindid     NO   
1008       
1008
1008      
表b:
CK     KW      bindid
AA    3J01     1008
BB    5501     1010

插入后a表是:
bindid     NO   
1008   AA-3J01-201401231705-001    
1008   AA-3J01-201401231705-002
1008   AA-3J01-201401231705-003
...

sql语句怎么写?或者“默认值或绑定”那里可以设置吗?谢谢。

------解决方案--------------------
引用:
前面的可以,但是001这个不行,sqlserver不知道你这个数据是第几份


前面的可以,后面的不行
或者你有自己的规则,没有说出来


update a 
set no = (select ck + '-' + kw from b where b.bindid = a.bindid) + '-' + convert(varchar(12),getdate(),112) + '-' + 编号

--在insert的时候可以做触发器,将前面部门截取后,按你的规则计算出编号,用变量存储,然后将前面部门根据相应的条件拼接,最后拼接上编号即可,要注意数字和字符拼接的时候,先将数字转成字符


------解决方案--------------------

update 表a
set [NO] = tb2.CK+'-'+tb2.KW+'-'+CONVERT(varchar(12), GETDATE(),112)+CONVERT(varchar(6), REPLACE(CONVERT(TIme, GETDATE()),':', ''))+'-'+RIGHT('000'+CONVERT(nvarchar(3),ROW_NUMBER() OVER(Partition by tb.bindid order by tb.bindid)),3)
from 表a
inner join 表b on 表a.bindid = 表b.bindid

------解决方案--------------------
NO作为一个智能键,根据楼主的要求,用默认值应该实现不了。建议
#1.NO用程序生成后,插入到数据库
#2.生成方式有2种:#1.用临时表配置表 2.直接用A表。
#3.但不管用哪种试,生成最后的序列号时,都要考虑并发。建议用配置表方式实现
------解决方案--------------------
引用:
Quote: 引用:

这个用触发器比较合适,因为你NO 的最后3位是变化的,递增的。

怎么样写触发器?


试试这个:

--drop table a,b
--go

create table a(bindid int,    NO varchar(50))

create table b(CK varchar(20), KW varchar(20), bindid int)

insert into b
select 'AA',    '3J01',     1008 union all
select 'BB',    '5501',     1010
go
   

create trigger dbo.trigger_a_insert
on dbo.a
for insert
as
begin

;with t
as
(
select a.bindid,
       a.NO,
       row_number() OVER(Partition by a.bindid order by getdate()) as rownum
from a
inner join (select distinct bindid from inserted) i
        on a.bindid = i.bindid
)

update t
set [NO] = b.CK+'-'+b.KW+'-'+
      &nb