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

あなたのアイデアには、「2100年に何が起こるか」などの明らかな問題がいくつかあります。および「1年に99999を超えるコードがある場合はどうなりますか?」また、「2つのコードがほぼ同時に要求された場合はどうなるか」など、あまり明白ではない問題がいくつかあります。また、サブ文字列からクエリを実行しているという事実は、SQL Serverがインデックスを使用できないことを意味します(パフォーマンスが悪い可能性があることを意味します)。

「2桁の年を取得するにはどうすればよいですか?」と「文字列を左パッドするにはどうすればよいですか?」Kafが答えたようです。

SQL Server 2012を使用している場合は、シーケンスを調べることをお勧めします。以前のバージョンを使用している場合は、年とその年の次の使用可能な数値を表す2つの整数フィールドを含む新しいテーブルをデータベースに配置し、スカラー関数をクエリとクエリが可能なストアドプロシージャに変更することをお勧めします。排他ロックを使用してそのテーブルを更新します。これにより、大きなテーブルであると想定しているものに対してテーブルスキャンを実行するのではなく、インデックス付きの小さなテーブルを使用して次の番号をすばやく見つけることができます。また、これは、システムに圧力がかかっている場合に起こりうる重複からユーザーを保護するのに役立ちます。

于 2012-12-15T16:01:04.323 に答える
0

次のレコードの取得MAX+1はあまり正確ではありません。より良い解決策はauto incremented identity(1,1) columnたとえば IdColdate 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 に答える