在存储过程参数中处理超过8000个字符

时间:2014-02-11 11:32:01

标签: sql-server tsql

我有一个发送邮件的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个字符?

6 个答案:

答案 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)列中(不幸的是,后半个字符被浪费了......)

SOURCE

答案 5 :(得分:0)

REPLICATE返回输入类型,与后续分配无关。这很烦人,但要避免静默截断,请尝试以下示例:

  

声明@x varchar(max)set @x = replicate(cast('a'as varchar(max)),   10000)选择@x,len(@x)

这是因为SQL Server在考虑您要分配的内容或尝试将其扩展到的字符数之前执行REPLICATE操作。它只关心输入表达式以确定它应该返回什么,如果输入不是max类型,它假定它适合8,000字节。