将 SELECT 的结果列表存储在变量中以进行计数并使用结果

Dae*_*hos 4 sql-server-2005 sql-server count update

我有一个存储过程,它使用游标,每次获取一个重复项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)。然后在(伪代码length(idlist)中使用该列表的长度。在这种情况下,在语句 (再次伪代码,)中再次使用该列表IFIF>100WHEREUPDATE TableB SET value = @cur_var WHERE ID IN idlist

我希望足够具体,我想将 a 的结果保存SELECT在变量中。然后使用结果WHERE IN variable和变量中的行数在IF.

使用 Microsoft SQL Server Enterprise Edition v9.00.3042.00,即 SQL Server 2005 Service Pack 2

编辑

我试图在不泄露任何私人信息的情况下使程序尽可能合理。

我的目的是删除重复的代码。theSELECT中使用的IF和from theSELECT中使用的是相同的,只是我首先需要 the ,然后是实际的sWHEREUPDATECOUNT(ID)ID

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
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只有SELECT一次,但后来又发生了两次SELECTS,一次 using*和一次COUNT(*)

@TempIDs难道就没有办法这样使用吗?(伪代码):

IF COUNT_ROWS(@TempIDs) > 5
BEGIN
    UPDATE TableB SET value = "wow" WHERE ID IN (@TempIDs)
END
Run Code Online (Sandbox Code Playgroud)

小智 5

如果您想将查询结果放入表变量中并迭代行,这可以轻松完成。当然要小心你的循环。

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 
Run Code Online (Sandbox Code Playgroud)