admin

文字栏不能存储超过8000个字符

sql

我对此进行了研究,发现textSQL Server中的一列可以存储超过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),似乎他们正在将字符添加到固定宽度布局中。


阅读 170

收藏
2021-06-07

共1个答案

admin

代码的问题不是存储值的字段的数据类型,而是存储在一起的值的类型。

的类型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,但这不是造成问题的原因。

2021-06-07