0

既存の VFP データベース (dbf ファイル) があり、それを SQL Server 2008 に移行したいと考えています。

問題は :

VFP データベースのテーブル « Invoices » には、次の形式の主キーがあります。

                                    year+counter       

例: 2013 年 --> 201300001, 201300002,…,20130000n 2012 年 --> 201200001, 201200002, 201200003,…..20120000n など

カウンターは毎年初めにリセットする必要があります

これらのシーケンスを計算するには、別の dbf テーブルからカウンターを取得し、インクリメントして保存します。ここでは、競合と重複キーのリスクに注意する必要があります。ID 列と、それが同時実行を回避する方法についてよく耳にしました。SQL自体がID列の計算を処理するためです。

言われたことに基づいて、これに対する解決策はありますか?

ありがとうございました。

こんにちはuser2511414、次のようにトリガーの代わりに試しました:

CREATE TRIGGER AutoIncrement_Trigger ON dblease.dbo.testAutoinc
instead OF INSERT AS
BEGIN
 DECLARE @ach CHAR
 DECLARE @ch CHAR
 DECLARE @num INT
 DECLARE @an  INT

 SET     @an  = year(GetDate())
 SET     @ach = Convert(char(4),@an)
select  @num = SUBSTRING(MAX(id),5,5) FROM dblease.dbo.testAutoinc having     SUBSTRING(MAX(id),1,4) = @ach

 INSERT INTO dblease.dbo.testAutoinc (id,designation,date) SELECT (@ach+CONVERT(VARCHAR(6),(@num+1))),inserted.designation, GetDate() FROM inserted
END

ただし、次のクエリを実行すると:

     insert into testAutoinc (designation, date) values ('TEST','25/06/2013');

次のエラーが表示されます:列 'Id'、テーブル 'dblease.dbo.testAutoinc' に値 NULL を挿入できません。列はヌルを許可しません。INSERT は失敗します。ステートメントは終了されました。

4

1 に答える 1

0

年用の列とカウンター用の列を持つことができます。その後、計算列を使用してそれらを年 + カウンター フィールドに連結できます。これを主キーにすることも、代理キーを主キーと見なして、年 + カウンター フィールドに一意のインデックスを配置することもできます。

カウンター番号を生成するには、トリガーを使用するか、強制的に挿入をストアド プロシージャ経由で行うことができます。一度に複数の行を挿入する必要があるか、常に 1 つずつ挿入する必要があるかによって異なります。

カウンターにID列を使用し、毎年の初めにリセットすることができます(DBCC CHECKIDENT RESEED)。これにより、トリガーまたはプロシージャを使用する必要がなくなりますが、あなた(または後継者)は忘れずにリセットする必要があります.

CREATE TABLE [dbo].[YearCounter](
    [YearId] [int] NULL,
    [Counter] [int] IDENTITY(1,1) NOT NULL,
    [Yc1]  AS (CONVERT([varchar](4),[YearId])+CONVERT([varchar](10),[Counter]))
)
ALTER TABLE [dbo].[YearCounter] ADD  CONSTRAINT [DF_YearCounter_YearId]  DEFAULT (datepart(year,getdate())) FOR [YearId]
于 2013-07-16T08:42:50.803 に答える