我对此进行了研究,发现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),看起来他们正在为固定宽度布局添加字符。
答案 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