编号的生成方法如下图
http://www.8288.net.cn/setup.jpg要求可以给用户修改上图设置,然后可以根据设置生成对应格式的编号。
最好是用存储过程或函数来实现这个编号生成,因为我需要在用户新增相关资料时根据上面的设置来生成这个编号。问题解决即给300分,决不食言。急求高手帮忙,万分感谢!!!

解决方案 »

  1.   

    set ANSI_NULLS ON
    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
      

  2.   

    只要能实现这个效果,字段名就用那些字段的拼音的第一个字母吧。
    比如全宗号就用QZH,归档年度就用GDLD,依此类推吧。
      

  3.   

    set ANSI_NULLS ON
    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
      

  4.   

    -- 用于保存用户编号方案的表
    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 行受影响)
      

  5.   

    -- 还可以改进一下, 加入常用函数-- 用于保存用户编号方案的表
    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 行受影响)
      

  6.   

    邹老大:
    我执行您的语句,发生如下错误:
    在函数内不正确地使用了 'getdate'。
    我的是SQL2000,在SQL2000的函数中是不能调用getdate()的,我以前也遇过这种问题,我一般是给函数传一个值进去(但是这样调用时比较麻烦),不知道您是怎么解决的?
      

  7.   

    下面是我根据邹老大的改的,代码如下:-- 用于保存用户编号方案的表
    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 
    上面的结果不是我想要的结果,可能我没有说清我的需求,我在楼下再重新详细地说一下需求。
      

  8.   

    其实我的需求是这样的首先:
    管理员进入档号设置界面设置档号格式(这个是可以修改的),如下图
    http://www.8288.net.cn/setup.jpg
    然后:
    操作员可以录入案卷目录的信息,如下图:(图中的红色横线中为用户录入部分。)
    http://www.8288.net.cn/setup2.jpg
    在上图中用户录入数据后提交,在后台,根据管理员设置的档号格式生成相应的档号(即上图中红色圆圈中的案卷档号)。
      

  9.   

    补充
    http://www.8288.net.cn/setup2.jpg
    图中的永久对应的编号是Y。
      

  10.   

    你告诉我,你是用什么实现,做的软件还是,网站???用的什么语言啊,我自己用PHP实现过和你这差不多的功能,在数据库里面只存储“案卷档号”就可以,自己编一个函数将“案卷档号”字段传进去,根据分割符号“-”将“案卷档号”分割成为几个单独的字段存数组就可以,返回数组;永久对应编号用个IF判断你会吧:)
    不知道你用的什么语言,弄在那高面,没办法给你写程序;给你思路就好哈
      

  11.   

    jiangjialin
    ---------------------------------
    谢谢您的我求的是数据库设计方案(MS SQL),用什么工具开发无所谓的。刚仔细看了下邹老大的第一次回复,发现这个比较接近我的需求。 :)
      

  12.   

    函数中调用Getdate可以通过视图
    CREATE VIEW GETNOW
    AS
    SELECT GETDATE() AS NOW
    然后查询这个视图就可以得到当前的时间
      

  13.   

    忽略了, 我在2005下呢.
    在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
      

  14.   

    至于"永久" 对应为Y的问题, 建议参考我的函数中, <YEAR>的处理, 将'永久' 以<永久>这类有固定分隔号的数据录入, 这样便于区分录入的是需要特别对待的数据, 还是普通数据.
      

  15.   

    我修改的一个,不知是否符合楼主的要求
    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
      

  16.   

    -- 用于保存用户编号方案的表
    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 行受影响)
      

  17.   

    当然, 对于期限本身来说, 一般是数字或者是描述, 所以也可以不加<>, 这只需要去掉函数中的<>即可.
      

  18.   

    运行了下袁老大最后的方案CZH -2006-1   - -JH -1   CZH -2006-1   - -JH -1   QZH -1   @1  -JH 结果是这样的,继续关注
      

  19.   

    to dragonbbc(dragon):你传入的部分参数为0长度字符, 而不是NULL, 所以出现的编码是那样的.
    我的函数中要求该参数不要的时候, 是NULL, 而不是0长度
      

  20.   

    奇怪,我运行邹老大的代码,结果也是:CZH -2006-1   - -JH -1   CZH -2006-1   - -JH -1   QZH -1   @1  -JH 保管期限不见了。
      

  21.   

    我是完全复制您的代码到查询分析器中执行的,也就是说传的参数你您传的是一样的。
    即:
    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')
      

  22.   


    -- 用于保存用户编号方案的表
    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
      

  23.   

    嗯,这下可以了
    运行结果如下:
    CZH-2006-1-1-AJH-P1 CZH-2006-1-Y-AJH-P1 QZH-1@P1-AJH
      

  24.   

    刚本来还以为有个传值顺序的问题,细心的看了一下程序,发现邹老大已经考虑进去了。只能用一个词语来形容:PERFECT!非常感谢!!!结贴,因一贴只能给100分,另开两贴给剩下的200分。