1

我正在尝试使用存储过程更新一些列值:

CREATE PROCEDURE [dbo].[UpdataObjectivesPosition] 
@idGoal int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @count int 
    SET @count = 1

    WHILE exists (SELECT * From Objective Where IDgoal = @idGoal)
    Begin
      Update [Tasks] Set Position=@count
      SET @count = @count + 1
    End
 END
 GO

但是我得到了一个无限循环,我认为这是因为 while 表达式。那么我怎样才能正确地创建这个程序呢?请帮我

例子:

姓名 职位

tskA - 4

tskB - 5

tskc - 7

我希望程序将位置设置为 1 , 2 , 3 , ....

4

2 回答 2

1

你根本不需要循环来实现你想要的,你可以使用ROW_NUMBER()函数来做到这一点:

WITH CTE AS
(   SELECT  *, rn = ROW_NUMBER() OVER(ORDER BY Name)
    FROM    Tasks
)
UPDATE  CTE
SET     Position = rn;

SQL Fiddle 示例

于 2013-06-02T16:20:23.663 回答
0

这是我最近发现的一个 SQL Server 解决方案。

DECLARE    @Count    INT = ( 
    SELECT  ISNULL(MAX([Position]),0) 
    FROM    [Objective] 
    )

UPDATE [Objective] 
SET     @Count = [Position] = @Count + 1
WHERE  [Position] IS NULL 

它使用双重赋值 ( SET @a = @b = @a + 1)。

SQLFiddle

了解更多信息

于 2013-06-02T16:27:43.653 回答