存储过程 varchar 输出参数

Posted

技术标签:

【中文标题】存储过程 varchar 输出参数【英文标题】:Stored procedure varchar output parameter 【发布时间】:2017-10-11 14:12:33 【问题描述】:

昨天,当我从我的 asp.net 应用程序中的存储过程返回一个 varchar(100) 输出参数时,我注意到一些奇怪的事情。看来返回的值现在包括额外的空格以返回完整的 100 个字符。这种行为是新的。我最近唯一改变的是将项目从 VS 2015 迁移到 2017。我正在使用 System.Data.SQLClient 连接到数据库。 varchar 列的 Select 语句仅返回列中的值,没有额外的空格。 Ansi_padding 对数据库关闭,并且在代码中的任何位置都没有设置。

set @Message = 'Project Updated!' --where @Message is varchar(100)

这将返回给客户端。

_UpdateStatus = oData.outputParams.Item("@Message") 
_UpdateStatus = "Project Updated!                                                                                    "

对正在发生的事情有什么想法吗?

【问题讨论】:

你用的是什么数据库? .NET 代码中参数的数据类型是什么?字符串还是字符串固定长度?请向我们展示更多您的代码 如果也提到数据库就更好了 从 SQL2016 中弃用 Ansi 填充:docs.microsoft.com/en-us/sql/database-engine/… Sql 服务器并在代码中使用字符串类型。我现在只是在类属性中添加了一个修剪函数。我将尝试下面提到的调试选项。 【参考方案1】:

懒惰的解决方案:

_UpdateStatus = ((string)oData.outputParams.Item("@Message")).Trim()

【讨论】:

要调试,您可以将存储过程中的属性 ANSI_PADDING 的值添加到输出中,以查看执行时它的值。例如:set @Message = 'Project Updated ANSI_PADDING value used was=' + SESSIONPROPERTY('ANSI_PADDING') 我知道 .NET SqlClient 有时会在设置连接时为其中一些属性(ANSI_NULLS、ANSI_PADDING、ARITHABORT 等)发送自己的默认值 我稍后会试试这个。我很好奇 .net 是否正在改变某些东西。数据库 ansi 填充设置为关闭。 "Project Updated ANSI_PADDING value used was=1 " 那么这是否意味着它处于开启状态? Yes 1 表示ANSI_PADDINGON。尝试通过在 SQL Server Management Studio 中右键单击它来生成存储过程的脚本,它将输出生成存储过程的ANSI_PADDING,它是一个可以为每个存储过程单独设置并覆盖数据库默认值的值(这可能“不是”造成混乱的根源;))。 我尝试将 ansi_padding 设置为关闭,但现在它给了我以下错误:link

以上是关于存储过程 varchar 输出参数的主要内容,如果未能解决你的问题,请参考以下文章

在PLSQL中,存储过程的输出参数最大支持多大

如何在Spring中调用存储过程来读取返回值和输出参数?

如何在sql server中创建一个存储过程中的varchar型的输入参数默认值为空

如何使sqlserver存储过程返回varchar

在存储过程中将输入参数作为值传递

Oracle存储过程在SSRS查询设计器中不起作用