2011-11-23 53 views
2

我的任務如下: 客戶想要從csv文件中讀取數字(可能是數千)的值。我有這樣的SQL SELECT語句中使用這些值:T-SQL IN運算符後面的數組是否存在最大大小?

SELECT * FROM myTable WHERE myTable.Value IN (cvsValue1, csvValue 2, ..., csvValueN) 

的問題是:這個工作CSV值的任意數,並且將它大量數值時表現良好?

我需要將SQL作爲字符串內部保存在我的C#應用​​程序中供以後使用。 (如果這對替代解決方案產生影響)

+2

我沒有張貼此作爲一個答案,因爲我不知道它是否會在您的特定情況下有用,但您是否知道[批量插入](http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into -sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server /)這是一個相當快速和簡單的方式c將CSV文件轉換爲SQL服務器表?關於將字符串內部保存以備後用的討論:是否可以將數據保存爲表格,然後執行連接或子查詢以獲取所需的信息? –

+0

[SQL Server查詢的最大大小? IN子句?有沒有更好的方法](http://stackoverflow.com/questions/1869753/maximum-size-for-a-sql-server-query-in-clause-is-there-a-better-approach) –

+0

@DavidHedlund :不幸的是,我不能只將數據放在一個「真正的」表格中 - 但是批量插入到臨時表格中可能會很好。謝謝。 – Michael

回答

2

你真的不想那麼做。這將是更好的那些值轉儲到的索引表,並使用IN爲子查詢(其通常實現SEMI JOINmore info)對串的陣列(其通常實現爲一系列OR操作。

BOL

Including an extremely large number of values (many thousands) in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table.

Error 8623:

The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Error 8632:

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

0

我想,最大允許列表中的IN操作符元素的數量取決於數據庫中,我讀的地方,我認爲,是因爲我有類似的問題,即OracleXE有1000種列表元素的限制,您應該。看看你的具體數據庫。
至於替代解決方案,您可以將此查詢分成幾個批次,其中列表包含的元素數量較少。

2

使用IN運算符和很多值(性能有限,您的請求不會執行並崩潰),性能非常差。

我不喜歡這樣

SELECT cast(Items as int) as id INTO #table_temp 
FROM dbo.split(@str_ids_comma,',') 

SELECT * 
FROM myTable 
WHERE EXISTS(
SELECT * 
FROM #table_temp 
WHERE id = myTable.Value 
) 

」 你可以找到分裂這裏的定義:http://www.sqlservercentral.com/articles/Tally+Table/72993/

+0

您的拆分功能也可能會遇到較大的數據集。看看這篇文章,深入瞭解db中的拆分方法:http://www.sqlservercentral.com/articles/Tally+Table/72993/ –

+0

我發佈的那個只是一個例子,你可能會更好,我會添加你的鏈接 –

+0

那麼,除了分裂問題,這看起來不錯。我只需將批量插入的值轉儲到臨時表中。 – Michael