我有一个字段来存储一些数据,该字段声明为varchar(max)。据我了解,这应该存储2^31 - 1个字符,但是当我输入超过8000个字符的内容时,它将切断其余字符。

我已经验证了所有数据都包含在我的更新语句中,并且查询看起来还不错

当我在网站上显示数据时,以及当我使用SSMS进行select content from table时,数据均被截断。

/> select DATALENGTH (content) from table返回为8000。

我使用以下数据设置数据:update table set content = 'my long content' where id = 1。内容中确实包含很多HTML,但是我看不到这会引起问题。我唯一能看到的是我将所有"替换为'',因为这是用户输入的内容(不记得为什么我现在这样做了。)

我确实设法将内容通过删除内容中的所有单引号正确输入,所以我认为我的数据而不是数据库发生了奇怪的事情。

我应该对查询做一些特殊的事情以使用varchar(max)字段吗?

使用:SQL Server 2008(10.50)64位。

#1 楼

如果要通过字符串连接构建字符串,请确保在所有组件字符串都不超过8,000个字符的情况下,将字符串文字之一明确转换为varchar(max)。否则,它将被视为非max数据类型,并且连接将被截断为8,000个字节。

在达到varchar(max)文字之前,如果合并长度超过8,000,则将其强制转换为varchar(max),以避免截断。

评论


在前两个示例上打印仅打印8000个字符,而分别遗漏最后5个和3个字符“ AAABC”和“ ABC”。

– Anand Gautam
17年8月25日在12:57

@anand。我的回答中没有PRINT。那截短的文字。

–马丁·史密斯
17年8月25日在13:39

我有一个用字符串编写的查询过程,例如。声明@ str varchar(MAX)='select * from Table1 ...',此字符串输入8193个字符,而在打印@ str“ print(@ str)”时,它仅打印8000个字符,如果执行,它将给出偏离路线的错误。

– Anand Gautam
17年8月25日在18:10

@AnandGautam提出有关此问题的新问题,并提供可重现此问题的完整代码。

–马丁·史密斯
17年8月25日在18:16

@AnandGautam我想这是问题吗? dba.stackexchange.com/q/184377/3690在这种情况下,PRINT一直将其截断。

–马丁·史密斯
17年8月26日在16:29