存储过程 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_PADDING
是ON
。尝试通过在 SQL Server Management Studio 中右键单击它来生成存储过程的脚本,它将输出生成存储过程的ANSI_PADDING
,它是一个可以为每个存储过程单独设置并覆盖数据库默认值的值(这可能“不是”造成混乱的根源;))。
我尝试将 ansi_padding 设置为关闭,但现在它给了我以下错误:link以上是关于存储过程 varchar 输出参数的主要内容,如果未能解决你的问题,请参考以下文章