1

我有这张表Test,因为Id, SomeValue, SomeText它包含大约一个磨坊记录,我将表更改为

ALTER TABLE Test
ADD ComputedColFloat FLOAT

一切都设置好了null,很好!我想要的是,对于每一行,ComputedColFloat 的值应该设置SomeValue为该行的列中值的总和。(其中的值SomeValue是使用RAND()! 计算的)

说,如果在添加列之前,前五行是

Id    SomeValue    SomeText
1     .91          text
2     .34          text
3     .52          text
4     .11          text
5     .68          text

我想要的是编写一个查询来更新表并将添加的列设置为将值反映为

Id    SomeValue    SomeText    ComputedColFloat
1     .91          text        .91   // .91
2     .34          text        1.25  // .91 + .34
3     .52          text        1.77  // .91 + .34 + .52
4     .11          text        1.88  // .91 + .34 + .52 + .11
5     .68          text        2.56  // .91 + .34 + .52 + .11 + .68 

我正在使用 sql server 2008,并且更愿意从 SSMS 中执行此操作,而不是通过 C# 或任何东西从 Visual Studio 执行此操作!(在 VS 中的 C# 中,我可以循环,找到总和,然后编写一个更新记录的查询,但这不是我需要的,我需要从 SSMS 中执行)
另外,如果有超过 1 种方法可以做这个,我想知道什么是最好的表现,因为我有一个磨坊记录,我不想永远等待!:(

4

3 回答 3

1

您可以为表创建游标并更新每一行。

        DECLARE CUR_TEST CURSOR LOCAL For Select ID,SomeValue From test ORDER BY ID ASC
        DECLARE @TOTALSUM FLOAT
                    DECLARE @ID INT
        DECLARE @SOMEMVALUE FLOAT
        OPEN CUR_LOCAL
        SET @TOTALSUM=0
        SET @SOMEVALUE=0
        FETCH CUR_LOCAL INTO @ID,@SOMEVALUE
        WHILE @@FETCH_STATUS = 0 
        BEGIN
            SET @TOTALSUM=@TOTALSUM + @SOMEVALUE
            Update TEST SET ComputedColFloat =@TOTALSUM Where ID=@ID
            FETCH CUR_LOCAL INTO @ID,@SOMEVALUE
        END
        CLOSE CUR_LOCAL
        DEALLOCATE CUR_LOCAL

在执行之前复制你的表来验证

于 2012-06-16T04:04:22.303 回答
1

这是比游标更好的选择:

首先,设置第一行的第一个值:

update Test set ComputedColFloat = [text] where id = 1

然后,您只需考虑前一行更新每一行

update t2 set ComputedColFloat = [text] + (select ComputedColFloat from Test  where id = t2.id-1 ) from Test t2  where t2.id > 1
于 2012-06-16T04:30:54.477 回答
0

你可以试试这个:

declare @sumUptoThatRow float,@query varchar(2000),@Id int,@ComputedColFloat float,@updateQuery nvarchar(max)

set @query = 'declare dbcursor cursor for select Id,ComputedColFloat  from test order by id '

set @sumUptoThatRow = 0.00

exec (@query)

open dbcursor

fetch next from dbcursor into @Id,@ComputedColFloat

while @@FETCH_STATUS = 0

begin

set @sumUptoThatRow = @sumUptoThatRow + @ComputedColFloat

--Update 
set @updateQuery = 'Update test set ComputedColFloat = ' + sumUptoThatRow + '  where Id = ' + @Id

exec (@updateQuery)

fetch next from dbcursor into @Id,@ComputedColFloat

end

close dbcursor

deallocate dbcursor
于 2012-06-16T04:11:52.407 回答