【问题标题】:Return strings from SQL Server stored procedures being truncated从被截断的 SQL Server 存储过程中返回字符串
【发布时间】:2018-05-22 19:10:14
【问题描述】:

我在 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"))

我得到了存储过程创建的实际长度 (>4000)、4000 和一个截断的字符串。

我怎样才能得到整个字符串?

【问题讨论】:

  • 不要将数据类型更改为 TEXT。 @MohsinMehmood TEXT 数据类型已被弃用,取而代之的是 varchar(max) 近 15 年了。
  • @MohsinMehmood:这是非常糟糕的建议 - TEXT 数据类型已弃用,应该使用无论如何 - 不要建议这个 - 请!
  • 这行得通(尽管在我的环境中我必须使用 SQLNCLI10)!谢谢@SearchAndResQ!我成功测试到 12549 个字符。

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


【解决方案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)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 负1?!好吧,碰巧@BoKeith 不是开玩笑,我在 SP 端(替代 max)和 ado 端(替代 2147483646)都尝试了它,并且都给出了错误。抱歉,没有投票!
    • 顺便说一句,一位同事建议我将我的 SP 输出拆分为多个 4000 个字符的字符串。但我不知道我需要多少!我为输出收集的一些数据库字段本身就是 nvarchar(max) (例如讲座的成绩单)。必须有更好的方法。
    • 我没有开玩笑;它最近对我有用。太糟糕了,它在这里不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2016-11-03
    • 2014-11-06
    • 1970-01-01
    相关资源
    最近更新 更多