2012-11-06 36 views
0

鉴于通过表的每一行中的另一个表使用游标循环和更新行这条SQL语句:光标在sqlsrv_query不工作

DECLARE @x varchar(100) 
DECLARE @y varchar(100) 
DECLARE c CURSOR FOR 
SELECT col1, col2 FROM table 
OPEN c 
FETCH NEXT FROM c INTO @x, @y 
WHILE @@FETCH_STATUS = 0 
BEGIN 
UPDATE table2 SET cola = @x WHERE colb = @y 
FETCH NEXT FROM c INTO @x, @y 
END 
CLOSE c 
DEALLOCATE c; 

如果我直接SQL控制台或Navicat的范围内运行该语句,一切都按预期工作。但是,如果我使用PHP运行它:

sqlsrv_query($sql) 

只有table2中的某些行实际上被更新。看起来SQL语句中的游标没有正确执行,或许sqlsrv_query在语句的游标仍在运行时返回?

有没有办法指示sqlsrv_query'等待',直到语句完全执行完成才返回结果?

+0

您是否考虑过存储过程? – podiluska

+0

我不想创建一个,但可能需要尝试。 – rmirabelle

回答

1

怎么样这样的事情,而不是一个游标。我必须编写游标的唯一原因是将旧模型转换为新模型,以便为转换运行一些业务规则等。我没有任何生产中的游标。

update table2 
    set cola = t1.col1 
from table2 t2 
join table1 t1 on t1.col2 = t2.colb 
+0

啊!更新!我怎么能忘记?此解决方案完美运作。保存了我的一天,并感谢我的感觉。 – rmirabelle