用于生成Year Wise客户端代码的自定义SQL函数

时间:2012-12-15 14:26:23

标签: c# sql-server

用于生成Year Wise客户端代码的SQL函数: 以下sql函数将根据server-date生成年度明智的客户端代码。例如对于2012客户,代码将是

CL12-00001CL12-00002,.... 2013年的代码将是

CL13-00001CL13-00002,....等。

(此处CL表示客户,12表示2012年,13表示2013年。)

CREATE function [dbo].[GenClientCode]() 
returns nvarchar(20) 
as 
begin 
Declare @Code nvarchar(20), @cyear nvarchar(2);
SET @cyear= ( SUBSTRING(CONVERT(nvarchar(2),DATEPART(year, sysdatetime())),3,2));
SET  @Code= (Select MAX(CONVERT(INT, SUBSTRING(ClientCode,6, LEN(ClientCode))))+1 
             from tblClientInfo WHERE   SUBSTRING(ClientCode,3,2)=@cyear);
            --assume the code format is like CL12-00001, here 12 for year 2012

if (@Code is null or @Code='') 
set @Code='00001'
else if LEN(@Code)=1
set @Code='0000'+ CONVERT(nvarchar(1),@Code);
else if LEN(@Code)=2
set @Code='000'+ CONVERT(nvarchar(2),@Code);
else if LEN(@Code)=3
set @Code='00'+ CONVERT(nvarchar(3),@Code);
else if LEN(@Code)=4
set @Code='0'+ CONVERT(nvarchar(4),@Code);

set @Code='CL'+@cyear+'-'+ CONVERT(nvarchar(10),@Code); 
return @Code;
end

我的功能是否最佳?

2 个答案:

答案 0 :(得分:0)

获取下一条记录的MAX+1不是很准确。更好的解决方案是拥有auto incremented identity(1,1) column说IdCol date column说dateCol 。然后,您可以在SELECT 上将您的特定代码格式化为;

SELECT 'CL' + RIGHT(DATEPART(yy,dateCol),2) + '-' + 
                RIGHT('00000' +  CONVERT(VARCHAR(5),idCol),5) 
                --Note:Max clients 99999

但是,您的功能也可以优化为;

CREATE function [dbo].[GenClientCode]() 
returns varchar(20) 
AS 
BEGIN 

    Declare @code varchar(20), @cyear varchar(2);

    SELECT @cyear = RIGHT(DATEPART(yy,Getdate()),2);

    SELECT @code =  ISNULL( MAX(
                            SUBSTRING(ClientCode, CHARINDEX('-', ClientCode) + 1,
                            LEN(ClientCode))
                          ), 0)+1 
    FROM tblClientInfo 
    WHERE SUBSTRING(ClientCode,3,2) = @cyear

    RETURN 'CL' + @cyear + '-' + RIGHT('00000' + @code, 5)

END

答案 1 :(得分:0)

您的想法有几个明显的问题,例如“2100年会发生什么?”并且“如果一年中有超过99999个代码会怎么样?”。还有一些不太明显的问题,例如“如果几乎同时请求两个代码会发生什么?”而且您正在对子字符串进行查询,这意味着SQL Server无法使用索引(这意味着您的性能可能不好)。

“如何获得2位数的年份?”和“我怎么左弦垫?”似乎已被Kaf回答。

如果您使用的是SQL Server 2012,我建议您查看序列。如果您使用的是早期版本,我建议将一个新表放入您的数据库,其中包含两个整数字段,表示该年份的年份和下一个可用数字,然后将您的标量函数更改为能够查询的存储过程使用独占锁更新该表。这将允许您使用索引的小表快速查找下一个数字,而不是对我认为是大表的表进行表扫描。如果您的系统处于压力之下,这也有助于保护您免受重复。

相关问题