ring bufferとして使用される表のポインタにCYCLE
オプションが使用されたsequenceを使用できます。これは、データベース内のシーケンスオブジェクトを作成します。
CREATE SEQUENCE BufferPtr
START WITH 1
MINVALUE 1
MAXVALUE 100000
CYCLE;
は空のエントリを許可するとID
CREATE TABLE dbo.TabOfEvents (
[Id] INT NOT NULL,
[cta] NCHAR (10) NULL,
[code] NVARCHAR (MAX) NULL,
[date] DATETIME2 (7) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
)
が続い100000枚の空のレコードとIDが1でテーブルを埋める入力できるように、異なるテーブルを作成します。.. 100000私たちは事前にレコード数を知り、自分自身でクエリを保存するためにこれを行います。つまり、挿入または更新を行う必要があるかどうかを知るために、レコードの数をSELECT COUNT (*) FROM TabOfEvents
と照会する必要はありません。 Sequenceは、更新するレコードを決定するためにUPDATEコマンド自体で使用されます。新しいシーケンス番号が毎回生成され、上限10万に達した後のシーケンスは、今1
-- This creates 100000 empty records with an Id. The code is quite tricky and I won't explain
-- the details here. If you prefer, create a stored procedure with a FOR-loop or do it in an
-- external application (e.g. C# Console app). Performance is not important, since we are
-- doing it only once.
;WITH e1(n) AS
(
SELECT 1 FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(0)) t(n)
)
INSERT INTO dbo.TabOfEvents (Id)
SELECT ROW_NUMBER() OVER (ORDER BY n10.n) AS n
FROM
e1 n10
CROSS JOIN e1 n100
CROSS JOIN e1 n1000
CROSS JOIN e1 n10000
CROSS JOIN e1 n100000
でやり直すテーブルとシーケンスが設定されている、あなたは
UPDATE TabOfEvents
SET cta = 'test', code = 'xxx', [date] = SYSDATETIME()
FROM
TabOfEvents
INNER JOIN
(SELECT
NEXT VALUE FOR BufferPtr AS Ptr
FROM (VALUES (1)) t(n)
) a
ON TabOfEvents.Id = a.Ptr;
でレコードを更新することができます
ここでは、4つのレコードのみを使用してテストを確認できます(http://sqlfiddle.com/#!6/2679e/5/2)。 をクリックしてください。SQLを繰り返し実行すると、1つのサイクルでイベントがどのように追加されるのかがわかります。
注:私は最初にUPDATE TabOfEvents SET cta = 'test', code = 'xxx', [date] = SYSDATETIME() WHERE Id = NEXT VALUE FOR BufferPtr
を使用しましたが、SQL ServerはWHERE句でシーケンスのクエリを拒否しました。私のUPDATE文を簡略化することはできますか?
確かにバッファは私が必要なものです、それは自分自身を削除自分自身を完全に管理することができますが、私はそれを実装することができます理解できませんでした、または私のアプリケーションで? – lawir
バッファのサイズは常に同じです。したがって、削除はもはや必要ではありません。データベースをセットアップするにはCREATE SEQUENCEが必要です(SQL Serverの構文を前提としていました)。 'UPDATE'はイベントをテーブルに入力するために必要なクエリです。エントリを循環的に置き換えます。 –
私はテーブルにイベントを入力するためにクエリに挿入を使用して、私は必要なものではない行を正確に更新したいときに、更新クエリが必要です。作成シーケンスに関しては、おそらくそれはデータベースとプログラミングのC#で非常に新しいですが、私はそれを行うことができるクエリを知らないし、私は本当にこのシーケンスを作成する場所と方法を知らないもっと具体的にお願いしますか? – lawir