从SQL Server存储过程中返回字符串被截断

时间:2018-05-22 19:10:15

标签: sql-server stored-procedures sql-server-2012 asp-classic

我在IIS 7.5上运行使用经典ASP和SQL Server 2012的网站。该网站是数据驱动的,我正在使用存储过程来创建HTML文本字符串来呈现网页。但是从存储过程传回的字符串被截断为4000个字符。如何阻止截断?

详细信息:我的存储过程定义为:

CREATE PROCEDURE [dbo].[spCourseButtonsDisplay]
    @str NVARCHAR(MAX) OUTPUT

存储过程中的字符串连接使用cast(我在某处读到这可以防止截断):

SET @str = CAST(@str + ... AS nvarchar(MAX));

最后,我回复:

RETURN len(@str)

请注意,我可以在SQL Server Management Studio中执行存储过程并获取超过4000的字符串(我已经使用> 12000进行了测试)。但在asp中却不是这样。

我在asp代码中定义了存储过程参数:

.Parameters.Append .CreateParameter("StrLen", 3, 4)  'adInteger, adParamReturnValue
.Parameters.Append .CreateParameter("Str", 202, 2, 2147483646)   'adVarWChar, adParamOutput

2147483646比MAX少一个,但是我可以放置的最大数字没有错误。

但是当我从asp执行存储过程并输出这3个值时:

Response.Write(CStr(objSP.Parameters("StrLen")) + "<br/>")
Response.Write(CStr(Len(objSP.Parameters("Str"))) + "<br/>")
Response.Write(objSP.Parameters("Str"))

我得到存储过程创建的实际长度(&gt; 4000),4000和截断的字符串。

如何获得整个字符串?

2 个答案:

答案 0 :(得分:1)

@SearchAndResQ上面检查Returning varchar(max) Output parameter from stored procedure truncating to 4000 characters的建议是我需要的:“你需要使用SQL Server Native Client而不是SQLOLEDB.1来支持VARCHAR(MAX)和NVARCHAR(MAX)数据类型;否则它们将被截断回其SQLOLEDB等价物“。我将连接字符串从Provider=SQLOLEDB.1;更改为Provider=SQLNCLI10;。我已经成功测试了大约12000个字符。请小心使用适当版本的SQL Server Native Client(SQLNCLI11,SQLNCLI10或SQLNCLI)。

答案 1 :(得分:0)

尝试使用-1作为返回参数的长度。