有没有办法绕过SQL Server中的8k行长度限制?

时间:2013-05-08 10:14:14

标签: sql sql-server tsql sql-server-2008-r2

首先,我知道通常有大量宽列是一个坏主意,但这是我受限制的格式。

我有一个应用程序,可以在操作它们并在数据库中插入/更新值之前将CSV文件导入到临时表中。临时表是动态创建的,具有可变数量的NVARCHAR列,文件将导入其中,另外还有两个INT列用作行ID。

我必须导入的一个特定文件大约有450列。使用大型NVARCHAR列中使用的24字节指针,通过我的计算,这会增加大约10k,我得到错误Cannot create a row of size 11166 which is greater than the allowable maximum row size of 8060.

有没有办法解决这个问题,还是我唯一的选择是修改导入器以拆分导入文件或从文件中删除列?

4 个答案:

答案 0 :(得分:3)

您可以使用使用16字节指针的text / ntext。而varchar / nvarchar使用24bytes指针。

NVARCHAR(最大)或NTEXT 可以存储超过 8kb 的数据,但记录大小不能超过 8kb 直到 SQL Server 2012 。如果数据不适合 8kb页面大小,则较大列的数据将移至另一页,并使用 24字节(如果数据类型为varchar / nvarchar)指针在主列中存储为引用指针。如果是text / ntext数据类型,则使用 16字节 poiner。

答案 1 :(得分:2)

答案 2 :(得分: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

答案 3 :(得分:0)

我同意Varchar或nvarchar(Max)是一个很好的解决方案,可能对你有用,但完整性我建议你也可以创建多个表,这两个表具有一对一的关系。