1

用于生成按年客户端代码的 SQL 函数: 以下 sql 函数将根据服务器日期生成按年客户端代码。例如对于 2012 客户,代码将是

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

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

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

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

我的功能是否最佳?

4

2 回答 2

0

获得MAX+1下一个记录不是很准确。更好的解决方案是有一个auto incremented identity(1,1) column比如说 IdCol和一个date column比如说 dateCol。然后您可以在SELECT as上形成您的特定代码;

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
于 2012-12-15T15:41:43.427 回答
0

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

“我如何获得两位数的年份?” 和“我如何左填充字符串?” 似乎已经被卡夫回答了。

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

于 2012-12-15T16:01:04.323 回答