如何将此sql server游标转换为基于set的速度?

时间:2016-11-09 06:40:57

标签: sql sql-server cursor

如果条件在一个表中为真,我必须插入多个表,即

Person

tableID      PersonUniqueNumber
1               123
2               1234
3               121
4               12
5               113333

和另一张表

RentedHousesDetail

HouseId(tableId)      HouseName         HouseLocation    ISOK
   1                     A                  CA            NO
   2                     B                  DT            NULL
   3                     C                  NY            NULL
   4                     D                  CA        
   5                     E                  CA

和其他表格

表     加利福尼亚州

表     STATUSGREEN

所以,我要做的是对于每个人,我必须看看他在RentedHousesDetail中的房屋位置是否为CA然后我必须在表CALIFORNIAHOUSE和STATUSGREEN中单行插入RentedHousesDetail.ID并更新RentedHousesDetail.ISOK列没有。

表中有数千行,所以我写了一个光标,例如

DECLARE variables

DECLARE cursorName CURSOR -- Declare cursor

LOCAL SCROLL STATIC

FOR

select PERSON.ID of those rows only where we have CA in RentedhouseDetails

OPEN cursorName -- open the cursor

FETCH NEXT FROM cursorName
INTO variables

WHILE @@FETCH_STATUS = 0

BEGIN

   FETCH NEXT FROM cursorName

   FOR EACH ROW that we have from cursor, insert into CALIFORNIAHOUSE and STATUSGREEN and update RentedHousesDetail.ISOK to NO

END

CLOSE cursorName -- close the cursor

DEALLOCATE cursor

请告诉我在Person和Rentedhousedetails表中的数千行上使用游标是否可以?如何将其转换为基于设置的速度操作?

2 个答案:

答案 0 :(得分:2)

我认为这里不需要使用游标。 首先,只有在RentedhouseDetails中有CA的位置才能选择那些行的PERSON.ID 像

select p.id from Person p JOIN RentedHousesDetail r ON p.ID=r.ID 
where r.HouseLocation='CA'

然后将所有记录插入CALIFORNIAHOUSE和STATUSGREEN表

喜欢这个

 Insert into CALIFORNIAHOUSE 
 select p.id from Person p JOIN RentedHousesDetail r ON p.ID=r.ID
 where r.HouseLocation='CA'

Insert into STATUSGREEN 
select p.id from Person p JOIN RentedHousesDetail r ON p.ID=r.ID
where r.HouseLocation='CA'

AND最后更新表RentedHousesDetail,其中HouseLocation =' CA' as' NO'

像这样

update RentedHousesDetail set ISOK='NO' from Person p JOIN RentedHousesDetail r ON p.ID=r.ID
where r.HouseLocation='CA'

答案 1 :(得分:1)

如果你使用临时表,那很简单。没有理由为此使用游标,并且以下性能应超过基于游标的解决方案。

显然,您需要填写伪代码的空白。

localhost:8080