Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 文本列存储的字符数不超过8000个_Sql_Sql Server 2008_Flat File - Fatal编程技术网

Sql 文本列存储的字符数不超过8000个

Sql 文本列存储的字符数不超过8000个,sql,sql-server-2008,flat-file,Sql,Sql Server 2008,Flat File,我对此进行了研究,发现SQL Server中的text列可以存储超过8000个字符。但当我在文本列中运行以下insert时,它只插入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 #

我对此进行了研究,发现SQL Server中的
text
列可以存储超过8000个字符。但当我在文本列中运行以下insert时,它只插入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
SET [File] = cast(b.Header as text) + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)
我正在尝试生成一个固定宽度的平面文件,每行应该有3900个字符长,并且它们在各自的临时表中。但当我在永久表中插入时,尾部数据被截断


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

根据
文本
字段不推荐使用。改用
VARCHAR(MAX)
字段。它们应该支持2GB的文本。

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


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

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

代码的问题不在于存储值的字段的数据类型,而在于组合起来存储在其中的值的类型

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

如果将第一个字符串强制转换为
文本
,则整个表达式将获得该类型,长度可能超过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
SET [File] = cast(b.Header as text) + CHAR(13) + CHAR(10) + d.Detail + c.Trailer + CHAR(13) + CHAR(10) + CHAR(26)

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

ntext
text
,和
image
数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用
nvarchar(max)
varchar(max)
varbinary(max)
@marc_你的答案也是正确的,我的初始测试没有达到8000个字符的限制,在我的答案中添加了解释。谢谢!这就是原因(山羊公司的答案)。