将varchar(max)输出参数从存储过程截断为4000个字符

时间:2014-02-10 01:50:15

标签: 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("@detail", 8, 2,  -1, strDetail)

8是adBStr的值。我尝试将8更改为200,201和203,但这会产生以下错误:

  

错误:800a0e7c

     

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

我认为更新数据会很困难,但我不知道如何检索列的全部内容。

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

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

有人有任何想法吗?

干杯, 麦克

1 个答案:

答案 0 :(得分:3)

您对连接字符串的假设是

您需要使用SQL Server Native Client而不是SQLOLEDB.1来支持VARCHAR(MAX)NVARCHAR(MAX)数据类型,否则它们将被截断回SQLOLEDB等效项。

然后,您希望使用以下参数定义

'For varchar(max) OUTPUT use;
Call cmd.Parameters.Append(cmd.CreateParameter("@detail", adLongVarChar, adParamOutput, -1, strDetail))

'For nvarchar(max) OUTPUT use;
Call cmd.Parameters.Append(cmd.CreateParameter("@detail", adLongVarWChar, adParamOutput, -1, strDetail))

'** Constants **
' adLongVarChar = 201
' adLongVarWChar = 203
' adParamOutput = 2