文本列不能存储超过8000个字符

时间:2014-06-04 15:36:00

标签: sql sql-server-2008 flat-file

我对此进行了研究,发现SQL Server中的text列可以存储超过8000个字符。但是当我在文本列中运行以下插入时,它只插入8000个字符:

UPDATE  a
SET [File] = b.Header + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)
FROM Summary a
JOIN #Header b ON b.SummaryId = a.SummaryId
JOIN #Trailer c ON c.SummaryId = a.SummaryId
JOIN #Detail d ON d.SummaryId = a.SummaryId
WHERE   
    a.SummaryId = @SummaryId

我正在尝试生成固定宽度的平面文件,每行的长度应为3900个字符,并且它们位于相应的临时表中。但是当我在永久表中插入时,Trailer数据会被截断。

我添加了char(10)+ char(13)来为文件末尾添加回车符和换行符以及char(26),看起来他们正在为固定宽度布局添加字符。

4 个答案:

答案 0 :(得分:3)

根据http://msdn.microsoft.com/en-us/library/ms187993.aspx TEXT字段已弃用。请改用VARCHAR(MAX)字段。他们应该支持2GB的文本。

答案 1 :(得分:2)

代码的问题不是存储值的字段的数据类型,它是您放在一起存储在其中的值的类型。

b.Header的类型不是text而是varchar,它用作整个表达式的类型。串联字符串时,结果将被截断以适合varchar值。

如果您将第一个字符串转换为text,则整个表达式将获得该类型,并且可以超过8000个字符:

SET [File] = cast(b.Header as text) + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)

当然,您应该转换为使用新类型varchar(max)而不是text,但这不是您遇到问题的原因。

答案 2 :(得分:1)

您的源字段不是VARCHAR(MAX),因此将它们连接在一起时有8000个字符的限制,您可以通过将连续列表中的第一个源字段转换为VARCHAR(MAX)来解决此问题:

UPDATE  a
SET [File] = CAST(b.Header AS VARCHAR(MAX)) + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)
FROM Summary a
JOIN #Header b ON b.SummaryId = a.SummaryId
JOIN #Trailer c ON c.SummaryId = a.SummaryId
JOIN #Detail d ON d.SummaryId = a.SummaryId
WHERE a.SummaryId = @SummaryId

如果将一千个VARCHAR(25)个字段连在一起,结果字符串的长度将为8000,因为提供数字长度时VARCHAR()类型的限制。 VARCHAR(MAX)不共享此限制,但concat列表会提供所提供的第一个字符串的类型。这是一个有趣的行为,但它是如何运作的。

答案 3 :(得分:0)

不推荐使用

TEXT - 请勿使用它!请改用VARCHAR(MAX)

我认为您需要将UPDATE语句中使用的所有列明确地转换为VARCHAR(MAX)才能实现此目的:

UPDATE  a
SET [File] = CAST(b.Header AS VARCHAR(MAX)) + CHAR(13) + CHAR(10) + 
             CAST(d.Detail AS VARCHAR(MAX)) + CAST(c.Trailer AS VARCHAR(MAX))) + CHAR(13) + CHAR(10) + CHAR(26)
FROM Summary a
JOIN #Header b ON b.SummaryId = a.SummaryId
JOIN #Trailer c ON c.SummaryId = a.SummaryId
JOIN #Detail d ON d.SummaryId = a.SummaryId
WHERE   
    a.SummaryId = @SummaryId