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)