当前位置: 代码迷 >> Sql Server >> SQL 怎的给你一表里的数据批量产生一串如下格式的条码
  详细解决方案

SQL 怎的给你一表里的数据批量产生一串如下格式的条码

热度:97   发布时间:2016-04-24 10:53:14.0
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)
*/

------解决方案--------------------
WITH    TT
          AS ( SELECT   number
               FROM     master..spt_values
               WHERE    type = 'P'
                        AND number BETWEEN 1 AND 20
             )
    SELECT  * ,
            'B' + RIGHT(CONVERT(VARCHAR, GETDATE(), 112), 6) + RIGHT('000'
                                                              + CONVERT(VARCHAR, number),
                                                              3) AS 条码
    FROM    TT

/*
number 条码
1 B140425001
2 B140425002
3 B140425003
4 B140425004
5 B140425005
6 B140425006
7 B140425007
8 B140425008
9 B140425009
10 B140425010
11 B140425011
12 B140425012
13 B140425013
14 B140425014
  相关解决方案