2013-05-08 120 views
5

首先,我知道一般情況下有大量的寬列是一個壞主意,但這是我被限制的格式。是否有解決SQL Server中8k行長限制的方法?

我有一個應用程序,在操縱它們並在數據庫中插入/更新值之前,將CSV文件導入臨時表。登臺表隨即創建,具有可導入文件的可變數量的NVARCHAR列,以及用作行ID的兩個INT列。

我必須導入的一個特定文件大約450列寬。由於在一個大的NVARCHAR列中使用了24字節的指針,所以我的計算結果總計達到了10K左右,並且我得到了錯誤Cannot create a row of size 11166 which is greater than the allowable maximum row size of 8060.

有沒有解決這個問題的方法,或者是我唯一的選擇修改導入器來分割導入或從文件中刪除列?

+0

看看SSIS。 http://www.microsoft.com/en-us/sqlserver/solutions-technologies/enterprise-information-management/integration-services.aspx它將允許您讀取CSV並過濾並將行拆分爲不同的目標表。 – flup 2013-05-08 10:35:38

+3

沒辦法。如果您在離線LOB驅逐後實際創建了一行+ 8k,那麼您的運氣不佳。 – 2013-05-08 10:58:49

+1

創建兩個或更多表格,並在與該鍵鏈接的這些表格周圍插入450列。 – Max 2013-05-08 13:09:03

回答

1

如果您使用的是SQL Server 2005,2008或2012,則應該能夠使用大於8,000個字符的NVARCHAR(max)或NTEXT。 MAX會給你2^31 - 1個字符:

http://msdn.microsoft.com/en-us/library/ms186939(v=sql.90).aspx

+0

我使用了這種變體。問題在於列數太多,24字節的指針對於行限制太多了。我作爲單個NVARCHAR(MAX)列導入,然後在操作 – Jaloopa 2013-05-10 09:42:28

+0

NVARCHAR(max)或NTEXT中存儲大於8kb的數據,但記錄大小不能大於8kb直到SQL Server 2012。 如果數據不是以8kb頁面大小安裝,那麼較大列的數據將移動到另一個頁面,並且24字節(如果數據類型爲varchar/nvarchar)指針用作主引用指針存儲在主列中。如果是文本/ ntext數據類型,則使用16個字節的poiner。 – 2014-01-11 14:31:15

3

您可以使用文本/它佔用16個字節的指針NTEXT。而varchar/nvarchar使用24字節的指針。

NVARCHAR(MAX),或是NTEXT可以存儲數據超過8KB,但創紀錄的大小不能大於8KB直到SQL Server 2012的。如果數據不是嵌入8KB頁大小然後較大的列的數據被移動到另一頁和24字節(如果數據類型是VARCHAR/nvarchar的)指針用於存儲爲在主柱參考指針。如果是文本/ ntext數據類型,則使用16字節 poiner。

+0

除非您使用SQL Server 2000或更早版本,否則不應使用文本或ntext。 – HLGEM 2014-01-11 14:16:11

+0

是的,@HLGEM你是對的。但是,如果varchar/nvarchar不能解決問題,那麼在最壞的情況下,我建議使用text/ntext。 由於Varchar/Nvarchar使用24字節指針,但text/ntext使用16字節指針,因此您可以使用text/ntext存儲1.5(24/16)倍以上的數據。所以我建議它只適用於最壞的情況。 我也建議,請避免在任何其他情況下使用ntext/text。 – 2014-01-11 14:19:51

+1

@Kaushik夏爾馬還增加了一些重要的信息。 http://stackoverflow.com/questions/14070932/work-around-sql-server-maximum-columns-limit-1024-and-8kb-record-size – 2014-02-21 15:13:37

0

我同意,VARCHAR或nvarchar的(最大)是一個很好的解決方案,可能會爲工作你,但完整性,我會建議你也可以創建兩個表具有一對一關係的多個表。

相關問題