2012-11-06 65 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