2017-05-08 85 views
1

我有以下兩個update語句 - >執行更新優化查詢

第一:

DECLARE @NR NVARCHAR(100); 

DECLARE RECORDSORDER CURSOR FAST_FORWARD FOR 


select gid from #CONFIRMEDORDER order by DOCUMENTCODE 


OPEN RECORDSORDER 
FETCH NEXT FROM RECORDSORDER INTO @NR 
WHILE @@FETCH_STATUS = 0 
BEGIN 

UPDATE MYLINKEDSERVER.SERVER.DBO.DocumentLinesTable 
SET 
udfvalue1=(SELECT Quantity1 FROM #CONFIRMEDORDER WHERE [email protected]), 
udfvalue2=(SELECT Quantity2 from #CONFIRMEDORDER WHERE [email protected]), 
Stringfield1=(SELECT Warehouse FROM #CONFIRMEDORDER WHERE [email protected]) 
WHERE [email protected] 

FETCH NEXT FROM RECORDSORDER INTO @NR 

END 

CLOSE RECORDSORDER DEALLOCATE RECORDSORDER 

--the second one comes right after the first one-- 

UPDATE MYLINKEDSERVER.SERVER.DBO.DocumentHeaderTable 
SET 
DocumentHeaderTable.ADFLAG3=1, 
DocumentHeaderTable.adstringfield3=(SELECT top 1 GRUPCUST FROM #CONFIRMEDORDER) 
WHERE GID IN (SELECT FDOCUMENTGID FROM #CONFIRMEDORDER) 

LE: 場景如下:我有5個文件每一個都有N行。第一條語句通過遊標來更新文檔中的所有行,基於臨時表中的某些信息,第二條語句在每個文檔中更新完所有行之後,更改作爲標誌的文檔狀態,從0到1.

我的問題是:第二條語句只有在所有文檔中的所有行都更新時(在第一條update聲明後)纔開始,無論它們有多少,我都想讓它啓動在每個文檔中的所有行被更新之後用1標記文檔標誌。我該如何執行此操作?謝謝

+0

我會更專注於第一次更新聲明。你正在做3個子查詢來更新一個表,爲什麼不把它作爲一個UPDATE SELECT語句來執行,所以你只打一次#CONFIRMEDORDER?另外,是否必須使用光標? SQL作爲基於集合的語言運行得更好。如果您可以提供一些示例數據,我相信可以以更有效的方式完成。 –

+0

@RichBenner - 請看我的LE。 – cdrrrrr

+0

我需要做3個子查詢,因爲最初我通過XML文件將一些信息從我的數據庫發送到另一個系統,之後,我收到相同的信息,我需要比較發送和接收的行。 – cdrrrrr

回答

0

Asuming Gid是你的documentId,下面的代碼應該工作。不過,我同意Rich Benner的觀點,如果你不需要,你不應該使用遊標。

  DECLARE @NR NVARCHAR(100); 
      DECLARE RECORDSORDER CURSOR FAST_FORWARD FOR 

      select gid from #CONFIRMEDORDER order by DOCUMENTCODE 

      OPEN RECORDSORDER 
      FETCH NEXT FROM RECORDSORDER INTO @NR 
      WHILE @@FETCH_STATUS = 0 
      BEGIN 

      UPDATE MYLINKEDSERVER.SERVER.DBO.DocumentLinesTable 
      SET 
      udfvalue1=(SELECT Quantity1 FROM #CONFIRMEDORDER WHERE [email protected]), 
      udfvalue2=(SELECT Quantity2 from #CONFIRMEDORDER WHERE [email protected]), 
      Stringfield1=(SELECT Warehouse FROM #CONFIRMEDORDER WHERE [email protected]) 
      WHERE [email protected] 

      UPDATE MYLINKEDSERVER.SERVER.DBO.DocumentHeaderTable 
      SET 
      DocumentHeaderTable.ADFLAG3=1, 
      DocumentHeaderTable.adstringfield3=(SELECT top 1 GRUPCUST FROM #CONFIRMEDORDER) 
      WHERE GID IN @NR 

      FETCH NEXT FROM RECORDSORDER INTO @NR 

      END 

      CLOSE RECORDSORDER DEALLOCATE RECORDSORDER 

同時嘗試使用聯接,而不是子查詢。

  UPDATE dlt 
      SET 
       udfvalue1=co.Quantity1, 
       udfvalue2=co.Quantity2, 
       Stringfield1=co.Warehouse 
      from MYLINKEDSERVER.SERVER.DBO.DocumentLinesTable dlt 
      join #CONFIRMEDORDER co on dlt.gid = co.gid 
      WHERE [email protected] 
+0

如果不使用遊標,我該如何瀏覽所有記錄?謝謝 – cdrrrrr

+0

您無需查看記錄,只需一次更新全部記錄。 – Peter

+0

這不是你的查詢。它在所有行更新之前標記文檔,這對我沒有幫助。 – cdrrrrr