0

私は良い DB 開発者になろうとしており、ここでループやカーソルを使用しないようにしていますが、これができるかどうかはわかりません。

テーブル A に、さまざまな処理キューへのポインターを表す行があります。テーブル BI には、処理が必要なデータがあります。テーブル A の行には、データを処理するために処理キューが最後に使用された時期を示すために使用される というdatetime列が含まれています。この列は、テーブル B の行が特定のキューに割り当てられるたびLastUsedに更新されます...そして、ラウンドロビン キューの問題の核心です。GETUTCDATE()

テーブル B に 50 のデータ行があり、テーブル A に 5 つのキュー行があるとします。セットベースの方法で、テーブル A のキュー ID をテーブル B の 50 行すべてに割り当てる必要がありUPDATE、最終的には次のようになります。

表 B

data record 1 - queue 1 
data record 2 - queue 2 
data record 3 - queue 3
data record 4 - queue 4
data record 5 - queue 5
data record 6 - queue 1
data record 7 - queue 2
data record 8 - queue 3
etc...

基本的に、LastUsedテーブル A の各キュー行の列は、テーブル B のデータ行のキュー列が更新されるたびに更新する必要があるため、次のデータ行はテーブル A から「新しい」最も古いキュー行を受け取ります。

UDF を作成しようとしましたが、UPDATEUDF 内からコマンドを使用できません。また、テーブル Bの別のステートメント内にラップすることを期待UPDATEして、句を使用してテーブル Aのネストされたステートメントを試しましたが、SQL Server は、そのような更新をネストできないことを通知します。OUTPUTUPDATE

私はここで立ち往生していますか?カーソルまたはループを使用する必要があります?

4

2 に答える 2

0
BEGIN TRAN

create table tmp_queue (age datetime, id int)
go

insert into tmp_queue values(getutcdate(), 1)
insert into tmp_queue values(getutcdate(), 2)
insert into tmp_queue values(getutcdate(), 3)
insert into tmp_queue values(getutcdate(), 4)
insert into tmp_queue values(getutcdate(), 5)
go

create table tmp_data (id int, data varchar(15))
go

insert into tmp_data values(1, 'foo')
insert into tmp_data values(2, 'foo')
insert into tmp_data values(3, 'foo')
insert into tmp_data values(4, 'foo')
insert into tmp_data values(5, 'foo')
insert into tmp_data values(6, 'foo')
insert into tmp_data values(7, 'foo')
insert into tmp_data values(8, 'foo')
insert into tmp_data values(9, 'foo')
insert into tmp_data values(10, 'foo')
insert into tmp_data values(11, 'foo')
insert into tmp_data values(12, 'foo')
insert into tmp_data values(13, 'foo')
insert into tmp_data values(14, 'foo')
insert into tmp_data values(15, 'foo')
go

create table tmp_queued_data (queue_id int, data_id int, inserted datetime)
go

insert into tmp_queued_data (queue_id, data_id, inserted)
select (RANK() OVER ( PARTITION BY id /6 ORDER BY id asc )) as queue_for_me, id, getutcdate()
from tmp_data



update tmp_queue 
set age = (select MAX(inserted)
            from tmp_queued_data
            where queue_id = tmp_queue.id)

select * from tmp_queued_data
select * from tmp_queue


ROLLBACK

これは、そのミリ秒を気にしないことを前提としています

于 2012-08-02T22:07:44.297 に答える
0

テーブルごとに 1 つずつ、2 つの別々のステートメントを使用する必要があると思います。その後、トランザクションでラップして、アトミシティを取得します。おそらく、分離レベルを適切なレベルに上げてください。

関数を使用してラウンドロビン割り当てを実現しROW_NUMBER、キューの数を法として取得できます。

于 2012-08-02T21:56:36.347 に答える