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

有没有办法绕过SQL Server中的8k行长度限制?,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,首先,我知道一般来说,拥有大量的宽列是一个坏主意,但这是我受限制的格式 我有一个应用程序,在操作CSV文件并在数据库中插入/更新值之前,它将CSV文件导入到临时表中。staging表是动态创建的,它有一个数量可变的NVARCHAR列,文件被导入到其中,另外还有两个INT列用作行ID 我必须导入的一个特定文件大约有450列宽。在一个大的NVARCHAR列中使用24字节指针,根据我的计算,这加起来大约是10k,我得到错误无法创建大小为11166的行,该行大于允许的最大行大小8060。 是否有办法解决

首先,我知道一般来说,拥有大量的宽列是一个坏主意,但这是我受限制的格式

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

我必须导入的一个特定文件大约有450列宽。在一个大的NVARCHAR列中使用24字节指针,根据我的计算,这加起来大约是10k,我得到错误
无法创建大小为11166的行,该行大于允许的最大行大小8060。


是否有办法解决此问题,或者我唯一的选择是修改导入程序以拆分导入或从文件中删除列?

如果您使用的是SQL Server 2005、2008或2012,您应该能够使用大于8000个字符的NVARCHAR(max)或NTEXT。MAX将为您提供2^31-1个字符:


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


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

有关详细信息,请访问以下链接:


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

看看SSI。它将允许您读取CSV,过滤并将行分割到不同的目标表。不可能。如果您实际上创建了一行+8k,即使在行外LOB逐出之后也是如此,那么您就不走运了。创建两个或多个表,并在这些表周围插入450个与键链接的列。我使用了一种变体。问题是列的数量太多,24字节的指针对于行限制来说太多。我作为单个NVARCHAR(MAX)列导入,然后在操作中将其拆分NVARCHAR(MAX)或NTEXT可以存储8kb以上的数据,但在SQL Server 2012之前记录大小不能大于8kb。如果数据不适合8kb的页面大小,则较大列的数据将移动到另一页,并使用24字节(如果数据类型为varchar/nvarchar)指针作为参考指针存储在主列中。如果是text/ntext数据类型,则使用16字节poiner。除非您使用的是SQL Server 2000或更早版本,否则不应使用text或ntext。是的,@HLGEM您是对的。但是如果varchar/nvarchar不能解决这个问题,那么在最坏的情况下,我建议使用text/ntext。因为Varchar/Nvarchar使用24字节指针,而text/ntext使用16字节指针,所以您可以使用text/ntext存储1.5倍(24/16)的数据。所以我建议只在最坏的情况下使用。我还建议在任何其他情况下,请避免使用ntext/text。@Kaushik Sharma还添加了一些重要信息。