2017-09-06 4 views
0

を見つけたとき、列の上位ランクのランクを高めるために:COLBが呼び出されトリガが設定以下の重複

  • 私は2列で、colA(データ型varchar型)を持つテーブルがあるとCOLB (データ型はint)
  • ユーザーが新しい行を挿入(またはEを更新する場合

    :必ずしも

チャレンジを発注していないユニークである必要があり、「ランク」、(すなわち1,2,3)、新しい(まだ存在していない)ランク(例えば、ランク付けされていないランク)を割り当てる。 4)=>問題ありません。

しかし、この場合、既に存在する新しい行(または既存のもの)を挿入すると、トリガーはすべてのランク(つまり2と3)を1つ増やす必要があります。だから、2が3になり、そして3は次のような結果をもたらすはずですその後4

CREATE TABLE Test (
colA varchar(5), 
colB int 
) 

INSERT INTO Test 
VALUES 
('Row1', 1), 
('Row2', 2), 
('Row3', 3) 

INSERT INTO Test 
Values 
('Row4', 2) 

次のようになります。

Row1 => 1 
Row2 => 3 
Row3 => 4 
Row4 => 2 

チャレンジ2:ランクはギャップがある場合に何をすべきかすなわち、

Row1 => 1 
Row2 => 2 
Row3 => 4 

今、新しい行を挿入したいRow4、2)表は次のようになります。

Row1 => 1 
Row2 => 3 
Row3 => 4 
Row4 => 2 

アイデアはありますか?私は今でもこれに対処する方法をしていません...

答えて

0

最後にいくつか見つかりました...これについてあなたは何を言いますか?改善のための提案?

--Create Table Test 
create table Test (colA varchar(5), colB int) 

insert into test 
values 
('Row1', 1), 
('Row2', 3), 
('Row3', 2), 
('Row4', 5), 
('Row5', 4) 

--Create Trigger 
Create TRIGGER [dbo].[tr_rank_insert] 
ON [dbo].[Test] 
AFTER Insert 
AS 

DECLARE 
    @newColA varchar(10), 
    @newColB int, 
SET @newColA = (Select colA from inserted) 
SET @newColB = (Select colB from inserted) 

DECLARE @rankid int 
DECLARE rank_cursor CURSOR FOR 
    SELECT colB 
    FROM Test 
    ORDER by colB asc 

OPEN rank_cursor 
FETCH NEXT FROM rank_cursor INTO @rankid 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF (@rankid < @newColB) 
     FETCH NEXT FROM rank_cursor INTO @rankid 

    ELSE 
     BEGIN 
      UPDATE Test 
      SET ColB = ColB + 1 
      WHERE ColA <> @newColA and ColB >= @newColB 

     BREAK 

    END 

    FETCH NEXT FROM rank_cursor INTO @rankid 

END 

CLOSE rank_cursor 
DEALLOCATE rank_cursor 

--Test 
INSERT INTO Test Values ('Row6', 2) 
INSERT INTO Test Values ('Row7', 5) 
関連する問題