编号的生成方法如下图
http://www.8288.net.cn/setup.jpg要求可以给用户修改上图设置,然后可以根据设置生成对应格式的编号。
最好是用存储过程或函数来实现这个编号生成,因为我需要在用户新增相关资料时根据上面的设置来生成这个编号。问题解决即给300分,决不食言。急求高手帮忙,万分感谢!!!
http://www.8288.net.cn/setup.jpg要求可以给用户修改上图设置,然后可以根据设置生成对应格式的编号。
最好是用存储过程或函数来实现这个编号生成,因为我需要在用户新增相关资料时根据上面的设置来生成这个编号。问题解决即给300分,决不食言。急求高手帮忙,万分感谢!!!
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: star
-- Create date: 2006-11-06
-- Description: 插入新数据
-- =============================================
CREATE PROCEDURE InsertNUM
@11 VARCHAR(20),
@12 INT,
@13 VARCHAR(4),
@21 VARCHAR(20),
@22 INT,
@23 VARCHAR(4),
@31 VARCHAR(20),
@32 INT,
@33 VARCHAR(4),
@41 VARCHAR(20),
@42 INT,
@43 VARCHAR(4),
@51 VARCHAR(20),
@52 INT,
@53 VARCHAR(4),
@61 VARCHAR(20),
@62 INT,
@63 VARCHAR(4),
@RESULT INT output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @CODE as varchar(300);
@CODE=@11+@12+@13+@21+@22+@23+@31+@32+@33+@41+@42+@43+@51+@52+@53+@61+@62+@63;
IF EXISTS
(
SELECT ziduanming
FROM tablename
WHERE ziduanming=@CODE
)
SET @RESULT=2
ELSE
BEGIN
INSERT COM_BNK_MST (ziduanming)
VALUES (@CODE)
IF @@ERROR=0
SET @RESULT=0
ELSE
SET @RESULT=1
END
END
比如全宗号就用QZH,归档年度就用GDLD,依此类推吧。
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: star
-- Create date: 2006-11-06
-- Description: 插入新数据
-- =============================================
CREATE PROCEDURE InsertNUM
@QZH_name VARCHAR(20),
@QZH_lenth INT,
@QZH_path VARCHAR(4),
@GDND_name VARCHAR(20),
@GDND_lenth INT,
@GDND_path VARCHAR(4),
@FLH_name VARCHAR(20),
@FLH_lenth INT,
@FLH_path VARCHAR(4),
@BGQX_name VARCHAR(20),
@BGQX_lenth INT,
@BGQX_path VARCHAR(4),
@AJH_name VARCHAR(20),
@AJH_lenth INT,
@AJH_path VARCHAR(4),
@YH_name VARCHAR(20),
@YH_lenth INT,
@YH_path VARCHAR(4),
@RESULT INT output
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @CODE as varchar(300);
SET @CODE=@11+@12+@13+@21+@22+@23+@31+@32+@33+@41+@42+@43+@51+@52+@53+@61+@62+@63;
IF EXISTS
(
SELECT ziduanming
FROM tablename
WHERE ziduanming=@CODE
)
SET @RESULT=2
ELSE
BEGIN
INSERT COM_BNK_MST (ziduanming)
VALUES (@CODE)
IF @@ERROR=0
SET @RESULT=0
ELSE
SET @RESULT=1
END
END
CREATE TABLE No(
SortID int,
OrderID int,
NoName varchar(10),
NoLen int,
NoSplit char(1),
NoValue varchar(10), -- NULL 表示从字段取值, 否则取固定值
Diable bit
)
-- 1 号方案
INSERT No SELECT 1, 1, '全宗号', 6, '-', 'CZH', 0
UNION ALL SELECT 1, 2, '归档年度', 4, '-', NULL, 0
UNION ALL SELECT 1, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 1, 4, '保管期限', 1, '-', NULL, 0
UNION ALL SELECT 1, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 1, 6, '页号', 3, '-', NULL, 0-- 2 号方案
INSERT No SELECT 2, 1, '全宗号', 6, '-', NULL, 0
UNION ALL SELECT 2, 2, '归档年度', 4, '-', NULL, 1
UNION ALL SELECT 2, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 2, 6, '保管期限', 1, '-', NULL, 1
UNION ALL SELECT 2, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 2, 4, '页号', 3, '-', NULL, 0
GO-- 一个函数, 用来生成编号
CREATE FUNCTION dbo.f_No(
@SortID int, -- 取第几号方案
@全宗号 varchar(10), -- 下面是与编号相关的各字段的值, 如果该字段不存在, 则设置为NULL
@归档年度 varchar(10),
@分类号 varchar(10),
@保管期限 varchar(10),
@案卷号 varchar(10),
@页号 varchar(10)
)RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re = N''
SELECT @re = @re
+ A.NoSplit + RIGHT(ISNULL(ISNULL(A.NoValue, B.NoValue), '<NULL>'), A.NoLen)
FROM No A,(
SELECT NoName = '全宗号', NoValue = @全宗号 UNION ALL
SELECT NoName = '归档年度', NoValue = @归档年度 UNION ALL
SELECT NoName = '分类号', NoValue = @分类号 UNION ALL
SELECT NoName = '保管期限', NoValue = @保管期限 UNION ALL
SELECT NoName = '案卷号', NoValue = @案卷号 UNION ALL
SELECT NoName = '页号', NoValue = @页号
)B
WHERE A.SortID = @SortID
AND A.Diable = 0
AND A.NoName = B.NoName
ORDER BY A.OrderID
RETURN(STUFF(@re, 1, 1, ''))
END
GO-- 然后, 可以直接引用这个函数得到编号, 也可以把该函数设置为编号的默认值
SELECT
方案1 = dbo.f_No(1, 'QZH', '2004', '1', '1', 'AJH', 'P1'),
方案2 = dbo.f_No(2, 'QZH', '2004', '1', '1', 'AJH', 'P1')
GO-- 删除测试
DROP TABLE No
DROP FUNCTION dbo.f_No-- 结果:
方案1 方案2
--------------------- --------------------
CZH-2004-1-1-AJH-P1 QZH-1-P1-AJH(1 行受影响)
CREATE TABLE No(
SortID int,
OrderID int,
NoName varchar(10),
NoLen int,
NoSplit char(1),
NoValue varchar(10), -- NULL 表示从字段取值, 否则取固定值
Diable bit
)
-- 1 号方案
INSERT No SELECT 1, 1, '全宗号', 6, '-', 'CZH', 0
UNION ALL SELECT 1, 2, '归档年度', 4, '-', '<YEAR>', 0
UNION ALL SELECT 1, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 1, 4, '保管期限', 1, '-', NULL, 0
UNION ALL SELECT 1, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 1, 6, '页号', 3, '-', NULL, 0-- 2 号方案
INSERT No SELECT 2, 1, '全宗号', 6, '-', NULL, 0
UNION ALL SELECT 2, 2, '归档年度', 4, '-', NULL, 1
UNION ALL SELECT 2, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 2, 6, '保管期限', 1, '-', NULL, 1
UNION ALL SELECT 2, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 2, 4, '页号', 3, '@', NULL, 0
GO-- 一个函数, 用来生成编号
CREATE FUNCTION dbo.f_No(
@SortID int, -- 取第几号方案
@全宗号 varchar(10), -- 下面是与编号相关的各字段的值, 如果该字段不存在, 则设置为NULL
@归档年度 varchar(10),
@分类号 varchar(10),
@保管期限 varchar(10),
@案卷号 varchar(10),
@页号 varchar(10)
)RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re = N''
SELECT @re = @re
+ A.NoSplit + RIGHT(ISNULL(ISNULL(ISNULL(C.value, A.NoValue), B.NoValue), '<NULL>'), A.NoLen)
FROM No A
INNER JOIN(
SELECT NoName = '全宗号', NoValue = @全宗号 UNION ALL
SELECT NoName = '归档年度', NoValue = @归档年度 UNION ALL
SELECT NoName = '分类号', NoValue = @分类号 UNION ALL
SELECT NoName = '保管期限', NoValue = @保管期限 UNION ALL
SELECT NoName = '案卷号', NoValue = @案卷号 UNION ALL
SELECT NoName = '页号', NoValue = @页号
)B
ON A.NoName = B.NoName
LEFT JOIN(
SELECT ValueName = '<YEAR>', Value = CONVERT(char(4), GETDATE(), 120) UNION ALL
SELECT ValueName = '<MONTH>', Value = RIGHT(CONVERT(char(6), GETDATE(), 120), 2) UNION ALL
SELECT ValueName = '<DAY>', Value = RIGHT(CONVERT(char(8), GETDATE(), 120), 2)
)C
ON A.NoValue = C.ValueName
WHERE A.SortID = @SortID
AND A.Diable = 0
ORDER BY A.OrderID
RETURN(STUFF(@re, 1, 1, ''))
END
GO-- 然后, 可以直接引用这个函数得到编号, 也可以把该函数设置为编号的默认值
SELECT
方案1 = dbo.f_No(1, 'QZH', '2004', '1', '1', 'AJH', 'P1'),
方案2 = dbo.f_No(2, 'QZH', '2004', '1', '1', 'AJH', 'P1')
GO-- 删除测试
DROP TABLE No
DROP FUNCTION dbo.f_No-- 结果:
方案1 方案2
------------------------ --------------
CZH-2006-1-1-AJH-P1 QZH-1@P1-AJH(1 行受影响)
我执行您的语句,发生如下错误:
在函数内不正确地使用了 'getdate'。
我的是SQL2000,在SQL2000的函数中是不能调用getdate()的,我以前也遇过这种问题,我一般是给函数传一个值进去(但是这样调用时比较麻烦),不知道您是怎么解决的?
CREATE TABLE No(
SortID int,
OrderID int,
NoName varchar(10),
NoLen int,
NoSplit char(1),
NoValue varchar(10), -- NULL 表示从字段取值, 否则取固定值
Diable bit
)
-- 1 号方案
INSERT No SELECT 1, 1, '全宗号', 6, '-', 'CZH', 0
UNION ALL SELECT 1, 2, '归档年度', 4, '-', '<YEAR>', 0
UNION ALL SELECT 1, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 1, 4, '保管期限', 1, '-', NULL, 0
UNION ALL SELECT 1, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 1, 6, '页号', 3, '-', NULL, 0-- 2 号方案
INSERT No SELECT 2, 1, '全宗号', 6, '-', NULL, 0
UNION ALL SELECT 2, 2, '归档年度', 4, '-', NULL, 1
UNION ALL SELECT 2, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 2, 6, '保管期限', 1, '-', NULL, 1
UNION ALL SELECT 2, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 2, 4, '页号', 3, '@', NULL, 0
GO-- 一个函数, 用来生成编号
CREATE FUNCTION dbo.f_No(
@SortID int, -- 取第几号方案
@全宗号 varchar(10), -- 下面是与编号相关的各字段的值, 如果该字段不存在, 则设置为NULL
@归档年度 varchar(10),
@分类号 varchar(10),
@保管期限 varchar(10),
@案卷号 varchar(10),
@页号 varchar(10),
@CurrDate datetime --在这里加入一个参数,用来传递当前日期[因为函数中不能用getdate()]
)RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re = N''
SELECT @re = @re
+ A.NoSplit + RIGHT(ISNULL(ISNULL(ISNULL(C.value, A.NoValue), B.NoValue), '<NULL>'), A.NoLen)
FROM No A
INNER JOIN(
SELECT NoName = '全宗号', NoValue = @全宗号 UNION ALL
SELECT NoName = '归档年度', NoValue = @归档年度 UNION ALL
SELECT NoName = '分类号', NoValue = @分类号 UNION ALL
SELECT NoName = '保管期限', NoValue = @保管期限 UNION ALL
SELECT NoName = '案卷号', NoValue = @案卷号 UNION ALL
SELECT NoName = '页号', NoValue = @页号
)B
ON A.NoName = B.NoName
LEFT JOIN(
SELECT ValueName = '<YEAR>', Value = CONVERT(char(4), @CurrDate, 120) UNION ALL
SELECT ValueName = '<MONTH>', Value = RIGHT(CONVERT(char(6), @CurrDate, 120), 2) UNION ALL
SELECT ValueName = '<DAY>', Value = RIGHT(CONVERT(char(8), @CurrDate, 120), 2)
)C
ON A.NoValue = C.ValueName
WHERE A.SortID = @SortID
AND A.Diable = 0
ORDER BY A.OrderID
RETURN(STUFF(@re, 1, 1, ''))
END
GO-- 然后, 可以直接引用这个函数得到编号, 也可以把该函数设置为编号的默认值
SELECT
方案1 = dbo.f_No(1, 'QZH', '2004', '1', '1', 'AJH', 'P1',getdate()),
方案2 = dbo.f_No(2, 'QZH', '2004', '1', '1', 'AJH', 'P1',getdate())
GO-- 删除测试
DROP TABLE No
DROP FUNCTION dbo.f_No
--结果
CZH -2006-1 - -JH -1 QZH -1 @1 -JH
上面的结果不是我想要的结果,可能我没有说清我的需求,我在楼下再重新详细地说一下需求。
管理员进入档号设置界面设置档号格式(这个是可以修改的),如下图
http://www.8288.net.cn/setup.jpg
然后:
操作员可以录入案卷目录的信息,如下图:(图中的红色横线中为用户录入部分。)
http://www.8288.net.cn/setup2.jpg
在上图中用户录入数据后提交,在后台,根据管理员设置的档号格式生成相应的档号(即上图中红色圆圈中的案卷档号)。
http://www.8288.net.cn/setup2.jpg
图中的永久对应的编号是Y。
不知道你用的什么语言,弄在那高面,没办法给你写程序;给你思路就好哈
---------------------------------
谢谢您的我求的是数据库设计方案(MS SQL),用什么工具开发无所谓的。刚仔细看了下邹老大的第一次回复,发现这个比较接近我的需求。 :)
CREATE VIEW GETNOW
AS
SELECT GETDATE() AS NOW
然后查询这个视图就可以得到当前的时间
在2000中, 可以建立一个视图
CREATE VIEW v_GETDATE
AS
SELECT dt = GETDATE()
GO-- 然后函数中引用这个视图得到日期即可:-- 一个函数, 用来生成编号
CREATE FUNCTION dbo.f_No(
@SortID int, -- 取第几号方案
@全宗号 varchar(10), -- 下面是与编号相关的各字段的值, 如果该字段不存在, 则设置为NULL
@归档年度 varchar(10),
@分类号 varchar(10),
@保管期限 varchar(10),
@案卷号 varchar(10),
@页号 varchar(10)
)RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
DECLARE @GETDATE datetime
SELECT @GETDATE = dt FROM v_GETDATE SET @re = N''
SELECT @re = @re
+ A.NoSplit + RIGHT(ISNULL(ISNULL(ISNULL(C.value, A.NoValue), B.NoValue), '<NULL>'), A.NoLen)
FROM No A
INNER JOIN(
SELECT NoName = '全宗号', NoValue = @全宗号 UNION ALL
SELECT NoName = '归档年度', NoValue = @归档年度 UNION ALL
SELECT NoName = '分类号', NoValue = @分类号 UNION ALL
SELECT NoName = '保管期限', NoValue = @保管期限 UNION ALL
SELECT NoName = '案卷号', NoValue = @案卷号 UNION ALL
SELECT NoName = '页号', NoValue = @页号
)B
ON A.NoName = B.NoName
LEFT JOIN(
SELECT ValueName = '<YEAR>', Value = CONVERT(char(4), @GETDATE, 120) UNION ALL
SELECT ValueName = '<MONTH>', Value = RIGHT(CONVERT(char(6), @GETDATE, 120), 2) UNION ALL
SELECT ValueName = '<DAY>', Value = RIGHT(CONVERT(char(8), @GETDATE, 120), 2)
)C
ON A.NoValue = C.ValueName
WHERE A.SortID = @SortID
AND A.Diable = 0
ORDER BY A.OrderID
RETURN(STUFF(@re, 1, 1, ''))
END
GO
CREATE VIEW GetNow
AS
SELECT GETDATE() AS NOW
GOCREATE FUNCTION dbo.f_No(
@SortID int,---------------采用6位二进制方式,比如1=〉000001 表示禁用页号
@全宗号 varchar(10) = 'CZH',----设置默认值
@归档年度 varchar(10) = NULL,
@分类号 varchar(10) = NULL,
@保管期限 varchar(10) = NULL,
@案卷号 varchar(10) = NULL,
@页号 varchar(10) = NULL,
@分割符 VARCHAR(1) = '-'
)RETURNS varchar(100)
AS
BEGIN
DECLARE @RE VARCHAR(100)
SET @RE = ''
IF @归档年度 IS NULL---------------如果@归档年度是空则取当前年份
SELECT @归档年度 = CAST(DATEPART(YEAR, NOW) AS VARCHAR) FROM GetNow
IF @SortID & 0X20 = 0
SET @RE = @RE + @全宗号 + @分割符
IF @SortID & 0X10 = 0
SET @RE = @RE + @归档年度 + @分割符
IF @SortID & 0X08 = 0
SET @RE = @RE + @分类号 + @分割符
IF @SortID & 0X04 = 0
SET @RE = @RE + @保管期限 + @分割符
IF @SortID & 0X02 = 0
SET @RE = @RE + @案卷号 + @分割符
IF @SortID & 0X01 = 0
SET @RE = @RE + @页号 + @分割符
RETURN LEFT(@RE, LEN(@RE) - 1)
END
GOSELECT
方案1 = dbo.f_No(0X0, 'QZH', '2004', '1', '1', 'AJH', 'P1', DEFAULT),
方案2 = dbo.f_No(0X14, 'QZH', '2004', '1', '1', 'AJH', 'P1', DEFAULT)
GODROP VIEW dbo.GetNow
DROP FUNCTION dbo.f_No
CREATE TABLE No(
SortID int,
OrderID int,
NoName varchar(10),
NoLen int,
NoSplit char(1),
NoValue varchar(10), -- NULL 表示从字段取值, 否则取固定值
Diable bit
)
-- 1 号方案
INSERT No SELECT 1, 1, '全宗号', 6, '-', 'CZH', 0
UNION ALL SELECT 1, 2, '归档年度', 4, '-', '<YEAR>', 0
UNION ALL SELECT 1, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 1, 4, '保管期限', 1, '-', NULL, 0
UNION ALL SELECT 1, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 1, 6, '页号', 3, '-', NULL, 0-- 2 号方案
INSERT No SELECT 2, 1, '全宗号', 6, '-', NULL, 0
UNION ALL SELECT 2, 2, '归档年度', 4, '-', NULL, 1
UNION ALL SELECT 2, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 2, 6, '保管期限', 1, '-', NULL, 1
UNION ALL SELECT 2, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 2, 4, '页号', 3, '@', NULL, 0
GOCREATE VIEW v_GETDATE
AS
SELECT dt = GETDATE()
GO-- 然后函数中引用这个视图得到日期即可:-- 一个函数, 用来生成编号
CREATE FUNCTION dbo.f_No(
@SortID int, -- 取第几号方案
@全宗号 varchar(10), -- 下面是与编号相关的各字段的值, 如果该字段不存在, 则设置为NULL
@归档年度 varchar(10),
@分类号 varchar(10),
@保管期限 varchar(10),
@案卷号 varchar(10),
@页号 varchar(10)
)RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
DECLARE @GETDATE datetime
SELECT @GETDATE = dt FROM v_GETDATE SET @re = N''
SELECT @re = @re
+ A.NoSplit + RIGHT(ISNULL(ISNULL(ISNULL(C.value, A.NoValue), B.NoValue), '<NULL>'), A.NoLen)
FROM No A
INNER JOIN(
SELECT NoName = '全宗号', NoValue = @全宗号 UNION ALL
SELECT NoName = '归档年度', NoValue = @归档年度 UNION ALL
SELECT NoName = '分类号', NoValue = @分类号 UNION ALL
SELECT NoName = '保管期限', NoValue = @保管期限 UNION ALL
SELECT NoName = '案卷号', NoValue = @案卷号 UNION ALL
SELECT NoName = '页号', NoValue = @页号
)B
ON A.NoName = B.NoName
LEFT JOIN(
SELECT ValueName = '<YEAR>', Value = CONVERT(char(4), @GETDATE, 120) UNION ALL
SELECT ValueName = '<MONTH>', Value = RIGHT(CONVERT(char(6), @GETDATE, 120), 2) UNION ALL
SELECT ValueName = '<DAY>', Value = RIGHT(CONVERT(char(8), @GETDATE, 120), 2) UNION ALL
SELECT ValueName = '<永久>', Value = 'Y'
)C
ON ISNULL(A.NoValue, B.NoValue) = C.ValueName
WHERE A.SortID = @SortID
AND A.Diable = 0
ORDER BY A.OrderID
RETURN(STUFF(@re, 1, 1, ''))
END
GO-- 然后, 可以直接引用这个函数得到编号, 也可以把该函数设置为编号的默认值
SELECT
方案1a = dbo.f_No(1, 'QZH', '2004', '1', '1', 'AJH', 'P1'),
方案1b = dbo.f_No(1, 'QZH', '2004', '1', '<永久>', 'AJH', 'P1'),
方案2 = dbo.f_No(2, 'QZH', '2004', '1', '1', 'AJH', 'P1')
GO
DROP VIEW v_GETDATE
DROP FUNCTION dbo.f_No
DROP TABLE No-- 结果:
方案1a 方案1b 方案2
----------------------- ----------------------- ---------------
CZH-2006-1-1-AJH-P1 CZH-2006-1-Y-AJH-P1 QZH-1@P1-AJH(1 行受影响)
我的函数中要求该参数不要的时候, 是NULL, 而不是0长度
即:
SELECT
方案1a = dbo.f_No(1, 'QZH', '2004', '1', '1', 'AJH', 'P1'),
方案1b = dbo.f_No(1, 'QZH', '2004', '1', '<永久>', 'AJH', 'P1'),
方案2 = dbo.f_No(2, 'QZH', '2004', '1', '1', 'AJH', 'P1')
-- 用于保存用户编号方案的表
CREATE TABLE No(
SortID int,
OrderID int,
NoName varchar(10),
NoLen int,
NoSplit char(1),
NoValue varchar(10), -- NULL 表示从字段取值, 否则取固定值
Diable bit
)
-- 1 号方案
INSERT No SELECT 1, 1, '全宗号', 6, '-', 'CZH', 0
UNION ALL SELECT 1, 2, '归档年度', 4, '-', '<YEAR>', 0
UNION ALL SELECT 1, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 1, 4, '保管期限', 1, '-', NULL, 0
UNION ALL SELECT 1, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 1, 6, '页号', 3, '-', NULL, 0-- 2 号方案
INSERT No SELECT 2, 1, '全宗号', 6, '-', NULL, 0
UNION ALL SELECT 2, 2, '归档年度', 4, '-', NULL, 1
UNION ALL SELECT 2, 3, '分类号', 6, '-', NULL, 0
UNION ALL SELECT 2, 6, '保管期限', 1, '-', NULL, 1
UNION ALL SELECT 2, 5, '案卷号', 3, '-', NULL, 0
UNION ALL SELECT 2, 4, '页号', 3, '@', NULL, 0
GOCREATE VIEW v_GETDATE
AS
SELECT dt = GETDATE()
GO-- 然后函数中引用这个视图得到日期即可:-- 一个函数, 用来生成编号
CREATE FUNCTION dbo.f_No(
@SortID int, -- 取第几号方案
@全宗号 varchar(10), -- 下面是与编号相关的各字段的值, 如果该字段不存在, 则设置为NULL
@归档年度 varchar(10),
@分类号 varchar(10),
@保管期限 varchar(10),
@案卷号 varchar(10),
@页号 varchar(10)
)RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
DECLARE @GETDATE datetime
SELECT @GETDATE = dt FROM v_GETDATE
SET @re = N''
SELECT @re = @re
+ A.NoSplit + RIGHT(ISNULL(ISNULL(ISNULL(C.value, A.NoValue), B.NoValue), '<NULL>'), A.NoLen)
FROM No A
INNER JOIN(
SELECT NoName = '全宗号', NoValue = @全宗号 UNION ALL
SELECT NoName = '归档年度', NoValue = @归档年度 UNION ALL
SELECT NoName = '分类号', NoValue = @分类号 UNION ALL
SELECT NoName = '保管期限', NoValue = @保管期限 UNION ALL
SELECT NoName = '案卷号', NoValue = @案卷号 UNION ALL
SELECT NoName = '页号', NoValue = @页号
)B
ON A.NoName = B.NoName
LEFT JOIN(
SELECT ValueName = '<YEAR>', Value = CONVERT(varchar(10), CONVERT(char(4), @GETDATE, 120)) UNION ALL
SELECT ValueName = '<MONTH>', Value = RIGHT(CONVERT(char(6), @GETDATE, 120), 2) UNION ALL
SELECT ValueName = '<DAY>', Value = RIGHT(CONVERT(char(8), @GETDATE, 120), 2) UNION ALL
SELECT ValueName = '<永久>', Value = 'Y'
)C
ON ISNULL(A.NoValue, B.NoValue) = C.ValueName
WHERE A.SortID = @SortID
AND A.Diable = 0
ORDER BY A.OrderID
RETURN(STUFF(@re, 1, 1, ''))
END
GO-- 然后, 可以直接引用这个函数得到编号, 也可以把该函数设置为编号的默认值
SELECT
方案1a = dbo.f_No(1, 'QZH', '2004', '1', '1', 'AJH', 'P1'),
方案1b = dbo.f_No(1, 'QZH', '2004', '1', '<永久>', 'AJH', 'P1'),
方案2 = dbo.f_No(2, 'QZH', '2004', '1', '1', 'AJH', 'P1')
GODROP VIEW v_GETDATE
DROP FUNCTION dbo.f_No
DROP TABLE No
运行结果如下:
CZH-2006-1-1-AJH-P1 CZH-2006-1-Y-AJH-P1 QZH-1@P1-AJH