【问题标题】:Returning varchar(max) Output parameter from stored procedure truncating to 4000 characters从存储过程返回 varchar(max) 输出参数截断为 4000 个字符
【发布时间】:2014-03-07 05:30:13
【问题描述】:

我有一个带有 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 吗?

有人有什么想法吗?

干杯, 迈克。

【问题讨论】:

  • 你不能只使用文本列而不是varchar,那么你可以输入任意数量的字符(嗯,最多2GB)
  • 我的理解是 SQL2005 不推荐使用文本。 Varchar(max) 无论如何都可以为您提供高达 2GB 的相同能力。我已经阅读了由于从 varchar(max) 到 varchar 的隐式转换而发生的截断,但我看不到在我的情况下会发生这种情况。感谢您的评论。
  • stackoverflow.com/questions/834788/… 连接字符串 -- 没有问题
  • @Mike 我可能错了,但你不只是使用cmd.Parameters.Append cmd.CreateParameter("@detail", 200, 3, -1, strDetail)吗? - 更喜欢通过将metadata 添加到global.asa 中来使用ADO 常量,这样它将是cmd.Parameters.Append cmd.CreateParameter("@detail", adVarChar, adParamInputOutput, -1, strDetail) 参见this 我发誓的优秀资源。你有什么理由使用adParamInputOutput (3) 而不是adParamInput (1)?
  • 嗨@Lankymart。对不起,它也不喜欢 200,3,-1。我收到以下错误:ErrorCode="800a0e7c", Description="参数对象定义不正确。提供的信息不一致或不完整。"我实际上已经将参数的方向从 3 更改为 2,因为它们都是来自 SP 的输出参数。干杯。

标签: asp-classic sql-server-2012 varcharmax


【解决方案1】:

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

您需要使用 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

【讨论】:

    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 2011-12-19
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多