2011-05-19 39 views
4

我有一個生成的SQL查詢塊,它將一個表值參數作爲輸入。如何爲文本命令創建表值參數

我有一個DataTable data輸入參數,則:

// add the table-value parameter 
var tvp = com.Parameters.AddWithValue("data", data); 
tvp.SqlDbType = SqlDbType.Structured; 
tvp.TypeName = "???"; 

com.ExecuteNonQuery(); 

的問題是,如果該命令不是一個存儲過程然後到被宣佈爲TypeName需求。

參數data中的列的數量和類型可能會有很大差異,所以我沒有可以使用的SQL類型。

有沒有什麼方法可以用這種方式使用TVP?

回答

3

您必須在服務器端有一個定義的TypeName才能傳遞一個表值參數。所以如果不存在,那麼不......你不能以這種方式使用表值參數。瞭解更多關於限制和要求在這裏:

http://msdn.microsoft.com/en-us/library/bb675163.aspx

我還沒有過嘗試過,但不應該有任何理由,你不能生成之前,根據這個代碼塊的創建類型名聲明你的數據表的結構。你可以選擇你想要的任何名字,然後在完成時放下它。

根據datatable的結構構建create typename語句需要一些編碼,但可以使用。

+2

是的,這是我走下的路線,但經過很多混亂之後,我發現它很慢。起初我認爲這是由於動態創建類型,但所有TVP調用都很慢。它看起來就像在引擎蓋下,TVP是用每行的'insert into'語句*構建的*。它更快速地(我們正在說幾秒到幾毫秒)動態構建自己的,甚至使用'SqlBulkCopy'。我認爲.Net的TVP實現可能會被破壞,因爲如果它使用''insert'來分隔值集合,那麼它會更快。 – Keith 2011-05-19 22:24:16

+0

良好的信息,感謝張貼您的經驗。你的問題引起了我的興趣,而當我有機會看看我能否實現它時,我會試試它。 – RThomas 2011-05-19 23:47:18