2013-05-08 119 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的(最大)是一个很好的解决方案,可能会为工作你,但完整性,我会建议你也可以创建两个表具有一对一关系的多个表。

相关问题