用于生成Year Wise客户端代码的SQL函数: 以下sql函数将根据server-date生成年度明智的客户端代码。例如对于2012客户,代码将是
CL12-00001
,CL12-00002
,.... 2013年的代码将是
CL13-00001
,CL13-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
我的功能是否最佳?
答案 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,我建议您查看序列。如果您使用的是早期版本,我建议将一个新表放入您的数据库,其中包含两个整数字段,表示该年份的年份和下一个可用数字,然后将您的标量函数更改为能够查询的存储过程使用独占锁更新该表。这将允许您使用索引的小表快速查找下一个数字,而不是对我认为是大表的表进行表扫描。如果您的系统处于压力之下,这也有助于保护您免受重复。