2013-09-16 83 views
0

我有一個stored-procedure其接受五個參數,並在表上減少數據庫的調用次數

Update Table 
Set field = @Field 
Where col1= @Para1 and [email protected] and [email protected] and col4 [email protected] 

進行更新從用戶預期可以爲所有的條件參數選擇多個值。 例如,您可以選擇2個選項,其需要匹配Col1中在數據庫表(這需要通過爲@ PARA1

所以我存儲所有選定值分開列出。

目前我使用foreach循環做更新

foreach (var g in _list1) 
      { 
       foreach (var o in _list2) 
       { 
        foreach (var l in _list3) 
        { 
         foreach (var a in _list4) 
         { 
          UpdateData(g, o, l,a); 
         } 
        } 
       } 
      } 

我敢肯定這是不這樣做,因爲這會調用數據庫調用的數量的好方法。有沒有什麼辦法可以忽略循環,並做最少數量的數據庫調用來實現相同的結果?

更新

我要尋找一些其他的方法比Table-Valued Parameters

+0

是不是所有的SP是幹什麼的?您是否可以在沒有SP的情況下自由執行此更新? – dasblinkenlight

+0

你在控制數據庫模式嗎?具體而言,您是否允許創建用戶定義的類型? – dasblinkenlight

+0

@dasblinkenlight:不,我不 –

回答

1

一種可能的方式是使用Table-Valued Parameters每況多個值傳遞給存儲過程。這將減少代碼中的循環,並應該仍然提供您正在尋找的功能。

如果我沒有弄錯他們是在SQL Server 2008中引入的,所以只要你不需要支持2005或更早的版本,他們應該可以使用。

1

考慮使用MS Data Access Application Block從企業庫的UpdateDataSet命令。

本質上,您將構建一個數據表,其中每行是一個參數集,然後對打開的連接執行「批處理」參數集。

當然,如果沒有這些,可以通過構建一個字符串來實現,並在數據庫中執行它。

0

爲什麼你使用存儲過程呢?在我看來,你不應該使用SP來做簡單的CRUD操作。存儲過程的真正威力在於大量計算以及類似的事情。

表值參數是我的選擇,但由於您正在尋找其他方法,您爲什麼不去更簡單的方式,只是動態地在您的服務器端代碼上構建批量/批量更新查詢,並針對D B?

+0

誰告訴你這個***存儲過程的真正動力是用於繁重的計算和類似的事*** *** –

+0

我認爲有些人認爲這一點,我同意你可以使用SP來做你想做的任何事情,但在我看來有一些情況在那裏你通過使用SP並不能獲得太多的收益,但是如果我們對存儲在數據庫中的數據進行大量計算,那麼使用SP肯定比試着以其他方式去做。 – 2013-09-16 20:15:38

1

由於表值參數是關閉的限制的話,你可以考慮一個基於XML的方法:

  • 構建包含四列,你想傳遞一個XML文檔。
  • 更改您的存儲過程的簽名接受一個XML值參數,而不是四個標量參數
  • 更改您的存儲過程的代碼來執行基於您獲得
  • 打電話給你新的XML更新存儲過程與使用四個嵌套循環在內存中構建的XML一次。

這應該減少往返次數,並加快整體執行時間。這裏是一個link to an article,解釋瞭如何使用XML一次性插入多行。你的情況有點類似,所以你應該能夠使用該文章中概述的方法。

+0

這真的很有趣,會嘗試。 –

+0

再一次,我不知道我們如何將多個參數關聯到條件 –

+0

@huMptyduMpty您需要運行[從聯接更新](http://stackoverflow.com/a/1293347/335858),並加入到XML數據。 – dasblinkenlight