2016-05-18 10 views
0

以下の情報を含むSQLテーブルにカスタムIDを作成したいと考えています。MS SQLでカスタム固有IDを生成

ID = 'SRIG' + 'DDMMYY' + 5桁の数字です。


あなたがそうのように、同様に計算列を使用することができます。表詳細

CREATE TABLE SR 
(
    SRREQID NVARCHAR(100) PRIMARY KEY, 
    -- Your @Entity ID might be another candidate here 
    SRID INT 
); 

SQLクエリ

DECLARE @EntityId INT; 
DECLARE @SRREQID NVARCHAR(100); 

-- BEGIN TRAN 
SELECT @EntityId = ISNULL(MAX(SRID),0) FROM SR; 

Select @SRREQID = 'SRIC'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)+ 
       RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+ 
       RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)+     
       RIGHT('000000'+ CONVERT(NVARCHAR(10), @EntityId+1),6); 

INSERT INTO SR(SRREQID,SRID) VALUES(@SRREQID,@EntityId+1); 

SELECT * FROM SR; 


-- COMMIT TRAN; 

クエリ出力

SRREQID    SRID 
SRIC160518000100 100 

答えて

2

create table SR 
    (SRREQID AS -- Your computed column 
     'SRIC'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)+ 
       RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+ 
       RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)+     
       RIGHT('00000'+ CONVERT(NVARCHAR(10), SRREQID_SEQ),5) 
    , SRREQID_SEQ INT IDENTITY(1,1) -- ID used by your computed column 
    , MyRandomVal varchar(25)) -- Random actual data for the table 

次に、00:00に正確に毎日開始する次のコマンドを実行して、翌日のSRREQID_SEQのIDを1で再起動するジョブを作成します。

DBCC CHECKIDENT ('dbo.SR', RESEED, 0); 

このついて行くにはよりスマートな方法があるかもしれませんが、その後、私は実際にはまだ、このようなものが有用であろう任意のシナリオに実行していません。

この利点のすべては、新しいデータを挿入するために複雑なスクリプトを必要としないということです。

データを正常に挿入するだけで、DBがSRREQIDを自動的に処理します。以下のようなので:

INSERT SR (MyRandomVal) VALUES ('My data') 

編集:はまた、私は彼が、さらにこのソリューションを簡素化し、あなたの状況やDBの負荷や使用状況に依存することができます提案を持っている以下のゾハルPeledのコメントを、チェックすることをアドバイス、フィットもあなたのシナリオは上記の私の提案よりも優れています。

+1

計算列は、私が行くだろう方向です。ただし、ジョブを使用してID列を再シードする代わりに、udfを使用して列を計算し、 'getdate()'の既存のレコードの 'count()'として数値を計算します。このようにして、主キーをID列として保持して、より簡単に使用できます。 –

+0

優秀なアイデア。公平ではあるが、これはデータの数によっては1つの挿入ごとにインデックスのシーク/スキャンが行われるため、ある時点でパフォーマンスが問題になる可能性があることを意味します。また、2つの並行トランザクションが同じ値を生成することが可能かどうかはわかりません。しかし、論理的に言えば、これは素晴らしい考えです。必要とされる余分なステップとメンテナンス(私の場合は仕事のような)が少ないほど、私の本の方が良い。 :) – Kahn

+0

もちろん、このデータを計算カラムに格納する必要はありません。テーブルにすでにIDカラムと作成カラムがある場合は、ビューを使用してこのカラムのデータを計算することができますその一部はselectステートメントです。しかし、一般的に、パフォーマンスの問題について人々が話しているときは、挿入/更新の選択ではなく選択されています。 –

1

SQL Server 2012以降。まず

SEQUENSEを作成します。

CREATE SEQUENCE dbo.testing 
    START WITH 1 
    INCREMENT BY 1 ; 
GO 

その後、新しいIDを取得し、これを実行できます。

SELECT 'SRIG' + REPLACE(CONVERT(nvarchar(10),GETDATE(),4),'.','') + 
     RIGHT('0000'+CAST(NEXT VALUE FOR dbo.testing as nvarchar(5)),5) 

出力:

SRIG18051600001 

はEDIT:

あなたが毎日のシーケンスを再起動する必要がある場合は、このクエリを使用します。

ALTER SEQUENCE dbo.testing RESTART WITH 1; 
+1

SEQUENCEは、2012以降のバージョンからのみ利用可能です。 OPがSQL Server 2008以下を使用している場合は、シーケンスを模倣するために別のメカニズムを使用する必要があります(レコードを挿入してscope_identity()を返すID列とストアドプロシージャを持つテーブルを使用してください) –

+0

警告ありがとう!私はそれを私の答えに入れます。 – gofr1

関連する問題