2013-01-24 72 views
0

我有一個遊標的性能問題,我想避免。 我試圖解決的問題是: 要使用由UDF計算的結果來更新Main表中每個記錄(大約6000000)(通過使用一個更新語句)的列(VARCHAR),UDF本身應該更新計數器在另一個Counter表中。
- 問題是UDF無法更新Countertable,因爲它是一個副作用。 - 由於READONLY標誌,它也不能更新臨時表或變量表。 - 我在主表上使用了一個更新觸發器,但是觸發器只觸發一次存儲在名爲inserted的表中的更新語句。SQL Server批量更新避免光標

我選擇的解決方案是使用光標如下。

  1. 從主表創建一個遊標。
  2. 讀取第一行
  3. 獲得從計數表
  4. 計數器++
  5. 呼叫PROC來計算結果,計數器,計數器等
  6. 更新從PROC結果主表
  7. 更新計數器表
  8. 獲取另一行

但是相信我是T oo慢125小時(沒辦法)。

有沒有人可以幫我嗎?

+0

你能更具體嗎?什麼是你的表結構,你想更新什麼? –

+0

我正在計數櫃檯表中的主表記錄,然後將該櫃檯存儲在主表中。謝謝。 – user2007209

+1

爲什麼你要在主表中存儲計數器? – fancyPants

回答

1

我假設你在主表中有另一列標識行,否則計數器沒有多大意義。

你可以試試這個嗎?如果我理解你的問題是正確的,那麼既不需要函數也不需要光標。只是一張臨時表,因爲您無法同時讀取和更新表格。

INSERT INTO tmpTable 
SELECT 
yourPrimaryKey, sex, YEAR(dob) AS dobyear, ROW_NUMBER() OVER (PARTITION BY YEAR(dob) ORDER BY dob) AS counter 
FROM 
mainTable; 

UPDATE mainTable 
SET code = CONCAT(tmpTable.sex, tmpTable.dobyear, counter) 
FROM 
mainTable 
INNER JOIN tmpTable 
ON mainTable.yourPrimaryKey = tmpTable.yourPrimaryKey; 

它沒有測試,請原諒任何語法錯誤或任何。

+0

非常感謝,這對我幫助很大。 – user2007209