我有一个发送邮件的SQL存储过程。它的签名看起来像这样:
CREATE PROCEDURE SendMail
@From varchar(40),
@To varchar(255),
@Subject varchar(255),
@Body varchar(max),
@CC varchar(255) = null,
@BCC varchar(255) = null
AS...
当消息是例如5000个字符时,它可以工作。当它是12 000时,我收到[ODBC SQL Server Driver]String data, right truncation.
根据帮助文件,varchar(max)可以处理2 ^ 31-1个字节/字符。
所以我尝试将@Body varchar(max)
更改为@Body varchar(30000)
,我收到错误
The size (30000) given to the type 'varchar' exceeds the maximum allowed for any data type (8000).
那么最大值是8000而不是2 ^ 31-1个字节? 如何处理超过8000个字符?
答案 0 :(得分:3)
您需要使用nvarchar(max),而不是varchar(4000)或varchar(max)。这可以存储最多2 GB的文本,这将解决您的问题......
有关详细信息,请参阅http://technet.microsoft.com/en-us/library/ms186939.aspx
答案 1 :(得分:2)
由于SQL Server页面大小为8K,文本字段不能大于8060字节(8K)...
varchar的最大字符数为8000 nvarchar的最大字符数为4000(每个字符 - > 2个字节)
您无法声明参数varchar(30000)
你应该使用varchar(max)或nvarchar(max) 第一个有2 ^ 31个字符(大约2亿个),后者有2 ^ 30个字符(大约10亿个)
此外,请注意SQL Server有一个存储过程名为 sp_send_dbmail ,您可以使用它来发送电子邮件...
答案 2 :(得分:0)
尝试使用NVARCHAR(MAX)
代替VARCHAR(MAX)
。
答案 3 :(得分:0)
使用BLOB数据类型。我偶尔会在非常长的领域使用它,但无法进行比较。我不相信BLOB上有最大长度。
答案 4 :(得分:0)
最大。容量是2 GB的空间 - 因此您正在查看超过10亿个2字节字符,这些字符将适合NVARCHAR(MAX)
字段。
使用其他答案更详细的数字,您应该可以存储
(2 ^ 31 - 1) / 2 = 1'037'741'823 double-byte characters
1 billion, 37 million, 741 thousand and 823 characters to be precise
在NVARCHAR(MAX)
列中(不幸的是,后半个字符被浪费了......)
答案 5 :(得分:0)
REPLICATE返回输入类型,与后续分配无关。这很烦人,但要避免静默截断,请尝试以下示例:
声明@x varchar(max)set @x = replicate(cast('a'as varchar(max)), 10000)选择@x,len(@x)
这是因为SQL Server在考虑您要分配的内容或尝试将其扩展到的字符数之前执行REPLICATE操作。它只关心输入表达式以确定它应该返回什么,如果输入不是max类型,它假定它适合8,000字节。