カーソルを使用するストアドプロシージャを使用して、重複するSELECT
をフェッチするたびに、見つかったIDの数(SELECT COUNT(ID) FROM TableA WHERE something.. @cur_var
)と、COUNT(ID)
が大きいかどうかを確認します次に、指定した値UPDATE
が別のテーブルWHERE
に発行されます。上記のIDが使用されます(_SELECT ID FROM TableA WHERE something.. @cur_var
_)。
アイデアは、SELECT
を変数に格納することです(疑似コードidlist= SELECT COUNT(ID) FROM TableA WHERE something.. @cur_var
)。次に、このlistの長さがIF
(pseudo-code IF
length(idlist)_>100
_。この場合、リストはWHERE
ステートメントで再び使用されます(疑似コードが再び、_UPDATE TableB SET value = @cur_var WHERE ID IN idlist
_ )
十分に具体的にしたいのですが、SELECT
の結果を変数に保存したいと思います。次に、_WHERE IN variable
_の結果と、IF
で使用する変数の行数を使用します。
Microsoft SQL Server Enterprise Edition v9.00.3042.00、つまりSQL Server 2005 Service Pack 2に取り組んでいます
[〜#〜]編集[〜#〜]
私は、個人情報を提供することなく、手順をできるだけ合理的にするよう努めました。
私の意図は、重複したコードを削除することです。 SELECT
で使用されているIF
と、SELECT
のWHERE
で使用されているUPDATE
は、最初に必要なことを除いて、同じです。 COUNT(ID)
、次に実際のID
s
_DECLARE @cur_id int;
SET @cur_id = 0;
DECLARE Cur CURSOR FOR
--this is actually a more complex SELECT but basically gives a list of IDs
SELECT ID FROM TableC ORDER BY ID DESC
OPEN Cur;
FETCH NEXT FROM Cur INTO @cur_id;
WHILE @@FETCH_STATUS = 0
BEGIN
--here I check if the count of found IDs (with value=NULL and IN the SELECT) is bigger than 5
IF
(
SELECT COUNT(ID) FROM TableA WHERE value=NULL AND ID IN
(
SELECT DISTINCT(ID) FROM TableB WHERE ID = @cur_id
)
) > 5
BEGIN
--if its bigger, set the value for every ID that is part of the ID list (the same select, but above the count, below no count)
UPDATE TableB
SET value = @cur_id
WHERE ID IN
(
SELECT ID FROM TableA WHERE value=NULL AND ID IN
(
SELECT DISTINCT(ID) FROM TableB WHERE ID = @cur_id
)
)
END
FETCH NEXT FROM Cur INTO @cur_id;
END
_
編集2:
これは、上記のSELECT
の重複に対する最も近い可能な解決策です。
_DECLARE @TempIDs TABLE
(
ID int
);
INSERT INTO
@TempIDs
--this is the select i have twice in the procedure above
SELECT
ID
FROM
TableA
SELECT COUNT(*) from @TempIDs
SELECT * FROM @TempIDs
_
この場合、SELECT
は1回だけですが、後に2つのSELECTS
が続き、1回は_*
_を使用し、1回はCOUNT(*)
を使用します。
このように_@TempIDs
_を使用する方法はありませんか? (疑似コード):
_IF COUNT_ROWS(@TempIDs) > 5
BEGIN
UPDATE TableB SET value = "wow" WHERE ID IN (@TempIDs)
END
_
クエリ結果をテーブル変数に入れて、簡単に実行できる行を反復処理する場合。もちろん、ループには注意してください。
DECLARE @Value int, @Label varchar(25)
DECLARE @Tmp table (value int, label varchar(25))
INSERT INTO @Tmp (value, label)
SELECT 1, 'One'
UNION SELECT 2, 'Two'
UNION SELECT 3, 'Three'
WHILE (SELECT count(1) FROM @Tmp) > 0
BEGIN
SELECT TOP 1 @Value = value, @Label = label FROM @Tmp ORDER BY value
DELETE FROM @Tmp WHERE value = @Value
SELECT @Value 'value', @Label 'label'
END