1

以下の形式のようにテーブルに主キーを入力する必要があります

YYYY/MMM/NNNNNN

ここで、YYYYは現在の年、MMMは月、NNNNNNはからのシーケンス番号です000001, 000002, 000003, .... 999999

したがって、私の主キーは次のようになり2012/Oct/000001ます2012/Oct/000010

このタイプのコードを生成するにはどうすればよいですか。

関数から年と月を取得できGetdate()ます。しかし、どのようにすればすべての挿入でシーケンス番号を管理できますか。そのための論理を教えていただけますか?

4

4 に答える 4

4

はるかに簡単な方法は、SQL ServerにINT IDENTITY列を使用して連続する数値のディッシングを処理させ、トリガーを使用して、別の列に必要な特定の形式を作成することです。

したがって、この表を考えると:

CREATE TABLE SampleTable 
             (ID INT IDENTITY, SaleDate DATE, ComputedPK VARCHAR(25) )

このようなトリガーを使用してComputedPKID(自動番号、SQL Serverによって処理される)から、およびSaleDate日付列としてを計算できます。

CREATE TRIGGER trgSampleTableInsert
ON dbo.SampleTable FOR INSERT
AS 
    UPDATE dbo.SampleTable
    SET ComputedPK = CAST(YEAR(i.SaleDate) AS CHAR(4)) + '/' + DATENAME(MONTH, i.SaleDate) + '/' + RIGHT('000000' + CAST(i.ID AS VARCHAR(6)), 6) 
    FROM dbo.SampleTable s
    INNER JOIN INSERTED i ON s.ID = i.ID

ただし、このアプローチは毎月1から始まるわけではありませんが、本当に必要ですか?連番は(数か月間でも)十分ではありませんか?

更新:もちろん、SQL Server 2012を使用している場合(使用しているSQL Serverのバージョンを指定していません...)-SEQUENCEオブジェクトを使用して連続番号を処理できます-さらに、それをリセットすることもできます月の初めごとに再び1にシーケンスします...。

于 2012-10-30T09:56:42.317 に答える
1
SELECT 
CONCAT(
      DATEPART(YEAR, GETDATE()),
      '/',
      DATENAME(MONTH,GETDATE()),
      '/',
      REPLACE(STR(((SELECT COUNT(*) FROM yourtable WHERE monthname = DATENAME(MONTH,GETDATE()) GROUP BY monthname) + 1),6,0),' ','0')
  )
  )

これはテストされていませんが 、現在テストされています。月名列を追加する必要があります(列を追加せずにこれを行う方法がありますが、これが最も便利です)

concatに依存したくない場合は、additionをキャストして使用することもできます。http://sqlfiddle.com/#!6/3e43d/6

于 2012-10-30T09:50:42.413 に答える
0

ID /数値列と日付列(または、日が不要な場合は年/月)を持つ複合キーを検討してみませんか?

これにより、同じ動作が得られ、実装/保守が少し簡単になります。

私はまだこれの背後にある理由を知りたいです-ちょうど私たちがより良い知識に基づいた推測をすることができるように

于 2012-10-30T09:55:17.237 に答える
0

主キーを2つの列に設定します。それらの1つはを表し、Datenもう1つはを表しSerial numberます。Serial自動的に増加する列にシーケンスを設定します。これにより、キーの日付部分を簡単にフィルタリングできます。

于 2012-10-30T09:47:46.863 に答える