Asp classic 从截断为4000个字符的存储过程返回varchar(max)输出参数

Asp classic 从截断为4000个字符的存储过程返回varchar(max)输出参数,asp-classic,sql-server-2012,varcharmax,Asp Classic,Sql Server 2012,Varcharmax,我有一个带有SQL2012数据库的经典ASP应用程序。我最近将一个表列从varchar(8000)更改为varchar(max),因为它不够大,无法存储所需的数据 我可以使用需要存储的所有数据更新列,但用于将列数据作为输出参数返回的SP仅返回4000个字符(至少以下代码的结果是这样的: Len(cmd.Parameters("@detail").Value) 我使用以下参数声明作为对SP调用的一部分: cmd.Parameters.Append cmd.CreateParameter("@de

我有一个带有SQL2012数据库的经典ASP应用程序。我最近将一个表列从varchar(8000)更改为varchar(max),因为它不够大,无法存储所需的数据

我可以使用需要存储的所有数据更新列,但用于将列数据作为输出参数返回的SP仅返回4000个字符(至少以下代码的结果是这样的:

Len(cmd.Parameters("@detail").Value)
我使用以下参数声明作为对SP调用的一部分:

cmd.Parameters.Append cmd.CreateParameter("@detail", 8, 2,  -1, strDetail)
8是adBStr的值。我尝试将8更改为200、201和203,但这会产生以下错误:

错误:800a0e7c

说明:
参数对象定义不正确。提供的信息不一致或不完整

我原以为更新数据会很困难,但我就是不知道如何检索该列的全部内容

我返回列的DATALENGTH,它说它的长度是10536,但我只得到4000个字符,包括通过输出参数返回的空格。我可以看到Visual Studio中的所有数据(10k个字符),所以我知道它在那里

我的连接字符串提供程序=SQLOLEDB.1。这可能是个问题吗?我是否应该使用较新的SQL Server本机客户端11.0 OLE DB提供程序-SQLNCLI11

有人有什么想法吗

干杯,
Mike.

您对连接字符串的假设是正确的

您需要使用SQL Server本机客户端而不是SQLOLEDB.1来支持
VARCHAR(MAX)
NVARCHAR(MAX)
数据类型,否则它们将被截断回相应的SQLOLEDB

然后,您需要使用以下参数定义

”用于varchar(最大)输出使用;
调用cmd.Parameters.Append(cmd.CreateParameter(@detail),adLongVarChar,adParamOutput,-1,strDetail))
'用于nvarchar(最大)输出使用;
调用cmd.Parameters.Append(cmd.CreateParameter(@detail),adLongVarWChar,adParamOutput,-1,strDetail))
“**常数**
'adLongVarChar=201
'adLongVarWChar=203
'adParamOutput=2

你不能只使用一个文本列而不是varchar,然后你可以输入任意多的字符(好吧,最多2GB)。我的理解是,SQL2005不推荐使用文本。varchar(max)提供了同样的能力,最多2GB。我读过关于截断的内容,因为varchar(max)的隐式强制转换到varchar,但我看不出在我的情况下会发生这种情况。感谢您的评论。连接字符串--不是issue@Mike我可能错了,但你不只是使用
cmd.Parameters.Append cmd.CreateParameter(“@detail”,200,3,-1,strDetail)吗
?-更喜欢使用ADO常量,方法是将
元数据添加到
全局.asa
中,因此它将是
cmd.Parameters.Append cmd.CreateParameter(“@detail”,adVarChar,adParamInputOutput,-1,strDetail)
请参阅我发誓的优秀资源。使用
adParamInputOutput
(3)的任何原因代替
adParamInput
(1)?Hi@LankyMat。它也不喜欢200,3,-1抱歉。我得到以下错误:ErrorCode=“800a0e7c”,Description=“参数对象定义不正确。提供的信息不一致或不完整。”我实际上已经将参数的方向从3改为2,因为它们都是SP.Cheers的输出参数。