日期:2014-05-16  浏览次数:20513 次

SQL 怎样给你一表里的数据批量产生一串如下格式的条码
一、现有一个表A,A01是唯一字段:
A01 (序号)   A02(条码)
------------------------------------
1                 null
2                 null
3                 null
...

二、现想给表A的A02产生如下格式的条码:B+YYMMDD+001 ,从001开始编号,产生条码后效果如下:
A01 (序号)   A02(条码)
------------------------------------
1                 B140425001
2                 B140425002
3                 B140425003
...


------解决方案--------------------
给个例子,自己参照着写

--以下代码生成的编号长度为12,前6位为日期信息,格式为YYMMDD,后6位为流水号。
--创建得到当前日期的视图
CREATE VIEW v_GetDate
AS
SELECT dt=CONVERT(CHAR(6),GETDATE(),12)
GO

--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(12)
AS
BEGIN
DECLARE @dt CHAR(6)
SELECT @dt=dt FROM v_GetDate
RETURN(
SELECT @dt+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) 
FROM tb WITH(XLOCK,PAGLOCK)
WHERE BH like @dt+'%')
END
GO

--在表中应用函数
CREATE TABLE tb(
BH char(12) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)

--插入资料
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)

--显示结果
SELECT * FROM tb
/*--结果
BH           col 
------------------- ----------- 
050405000001  1
050405000002  2
050405000003  4
050405000004  14
--*/


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

create table 表A
(A01 int,A02 varchar(20))

insert into 表A
 select 1,null union all
 select 2,null union all
 select 3,null


-- 更新
update a
 set a.A02=b.A02
 from 表A a
 inner join
 (select A01,
         'B'
         +substring(convert(varchar,getdate(),112),3,6)
         +right('000'+rtrim(row_number() over(order by A01)),3) 'A02'
  from 表A) b on a.A01=b.A01


-- 结果
select * from 表A

/*
A01         A02
----------- --------------------
1           B140425001
2           B140425002
3           B140425003

(3 row(s) affected)
*/

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