【问题标题】:SQL Server Stored Procedure with varchar parameter returns wrong results带有 varchar 参数的 SQL Server 存储过程返回错误的结果
【发布时间】:2023-04-03 16:58:01
【问题描述】:

我创建了一个带有varchar(5) 类型参数的存储过程。我的存储过程运行良好,并返回正确的结果,直到我将一个 6 个或更多字符的字符串传递给它。

发生的情况是它忽略了第 6 个字符,并且仅根据前 5 个字符返回结果,这是错误的结果。当我传递更长的字符串时,我希望它会引发错误。

这是一个错误还是有办法改变 SQL Server 的这种行为?

create procedure usp_testproc 
    @param1 varchar(5)
as
begin
    if @param1 = '12345'
    begin
       select 'you got this right'
    end 
    else
    begin
       select 'String Mismatch'
    end
end

不管我们是否调用

exec usp_testproc '12345'

exec usp_testproc '123456'

我们得到相同的结果

【问题讨论】:

  • '123456' 超过 5 个字符,这意味着它被您的参数大小 varchar(5) 截断为 '12345'(根据您的代码,而不是您的问题说明 varchar(10))。跨度>
  • 尝试“12345”和“1234”。很确定你会得到不同的结果。
  • 正如@SqlZim 解释的那样,它将返回与您传递的任何以'12345' 开头的字符串相同的结果。即使你通过'123456789'
  • 更多关于这里的讨论:stackoverflow.com/questions/4628140/…
  • 这是 SQL Server 的问题。有一个关于此问题的开放 Microsoft Connect 项目。connect.microsoft.com/SQLServer/feedback/details/622699/…

标签: sql sql-server tsql stored-procedures


【解决方案1】:
varchar(5) 

这意味着您将只获得前 5 个字符,因此它将忽略其余字符,“()”内的数字显示您将在此参数中存储多少个符号。您可以确保自己使用可以从您的程序返回的最长的字符串,这样就可以了 您可以阅读以下内容: char and varchar (docs.microsoft)

【讨论】:

  • 请尝试为 OP 解释一些内容,我觉得您的回答就像评论一样。
  • 这是一条评论,您需要有至少 50 的声誉分数才能发表评论,所以有些帖子 cmets 作为答案。 :-)
【解决方案2】:

您需要指定正确的入参类型:

create procedure usp_testproc @param1 varchar(<max number of chars here>)
as...

【讨论】:

    【解决方案3】:

    存储过程根据其内部所做的工作完美运行。该错误在您的实现中。您的 SP 接受最多 5 个字符的长字符串,但您希望它可以处理超过 5 个字符的字符串,这是矛盾的。所以你必须修改你的SP才能得到你想要的结果,你可以很容易地将varchar参数的长度增加到一个可接受的范围,这样输入就不会超过它。所以你可以做这样的事情:

    create procedure usp_testproc @param1 varchar(50)
    as
    begin
    
    if len(@param1)<6
    begin
        if @param1='12345'
            begin
               select 'you got this right'
            end 
            else
            begin
               select 'String Mismatch'
            end
        end
    else
        begin
           select 'Parameter length is high!'
        end 
    end
    

    【讨论】:

    • 发表评论对所有人都有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2021-06-29
    相关资源
    最近更新 更多