我使用经典的ASP和SQL Server 2012在IIS 7.5上运行一个网站。该网站是数据驱动的,我使用存储过程创建HTML文本字符串来显示Web页面。但是从存储过程传回的字符串将被截断为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小1,但这是我能放在没有错误的最大数字。
但是当我从asp执行存储过程并输出这3个值时:
Response.Write(CStr(objSP.Parameters("StrLen")) + "<br/>")
Response.Write(CStr(Len(objSP.Parameters("Str"))) + "<br/>")
Response.Write(objSP.Parameters("Str"))
我得到了存储过程创建的实际长度(> 4000 )、4000和一个截断的字符串。
我怎样才能得到整个字符串?
发布于 2018-05-29 09:04:23
上面@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)。
发布于 2018-05-23 06:01:01
尝试使用-1作为返回参数的长度。
https://stackoverflow.com/questions/50474892
复制相似问题