TSQL在不包含顺序ID的行中循环

TSQL在不包含顺序ID的行中循环,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要遍历表中的每一行来执行一些操作。表的主键是GUID标识符,因此我不能在循环中真正使用它。这就是我到目前为止所做的: DECLARE @RowCount INT SET @RowCount = (SELECT COUNT(EmploymentIdentifier) FROM tblEmployment) DECLARE @I INT SET @I = 1 WHILE (@I <= @RowCount) BEGIN --Just some variables I'll be

我需要遍历表中的每一行来执行一些操作。表的主键是GUID标识符,因此我不能在循环中真正使用它。这就是我到目前为止所做的:

DECLARE @RowCount INT
SET @RowCount = (SELECT COUNT(EmploymentIdentifier) FROM tblEmployment)

DECLARE @I INT
SET @I = 1

WHILE (@I <= @RowCount)
BEGIN
    --Just some variables I'll be using later
    DECLARE @PaymentTypeOld int, @PaymentTypeNew uniqueidentifier

    -- How do I select each unique row here? I'm stuck at:
    SELECT TOP 1 FROM tblEmployment WHERE EmploymentIdentifier == ???

    //Logic goes here..

    SET @I = @I + 1

END
我试着玩弄ROW_NUMBER,但由于不正确地使用OVER,一直出现语法错误


我以什么顺序处理行并不重要,只要处理表中的所有行即可

当col1的值为1时,这将仅设置myField=当前值*2当col1的值为2时,myField将乘以3。如果col1是其他值,则myField保持不变

Update myTable set MyField = Case when Col1 = 1 then MyField*2  
                                  When Col1 = 2 then MyField*3
                                                else myfield end
你也可以做多个条件。。。 现在,在我们将结果乘以2之前,Col1必须是1,col2必须是N

Update myTable set MyField = Case when Col1 = 1 and Col2 ='N' then MyField*2 
                                                              else MyField end
它也可以是一个简单的where子句,它减少了要处理的记录的开销。如果我们只需要将某些记录更新为特定的值,那么它似乎是最有效的,但是如果所有记录都必须更新,并且更新因记录而异,那么case语句就是最好的选择

当col1为1时,这只是将myField乘以2

Update mytable set myField = myField*2 where col1=1  

您想使用光标。表面上与@jhilden一致。每当我在处理关系集数据时听到游标,我首先会问有没有更好的方法。。。因此,根据您所做的工作,光标将起作用,但它可能不是问题的最佳解决方案。但它确实解决了这个问题。@xQbert和jhilden谢谢你们两位。我将从一列中读取值,然后基于该值,我将为同一行的另一列插入一个新值。我将对该表中的所有行执行此操作。光标是解决这个问题的方法吗?我不同意这里的@jhilden。如果您正在执行update语句update some table set some value=某些条件为真的其他值,我将在整个集合中处理它,而不是作为游标。总体而言,游标速度较慢。两者都会起作用;但是在本例中,我认为集合处理比记录处理好。您可以使用case语句而不使用游标来实现这一点。我很好奇为什么这里会给出case示例?似乎带有where子句的更新是最简单的示例,也最不容易混淆。它与是否需要根据col1中的值进行不同的活动有关。比如说,当col1为1时,我们要取myfield*2,当col2为2时,我们要将myfield乘以3。您不能使用where子句在一次更新中实现这一点。您必须使用多个或比case更复杂的SQL。case示例的使用正是我所需要的。我不知道如何用SQL来表达这一点。谢谢