带有varchar参数的SQL Server存储过程返回错误的结果

时间:2017-11-07 18:29:29

标签: sql sql-server tsql stored-procedures

我创建了一个存储过程,它接受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'

我们得到相同的结果

3 个答案:

答案 0 :(得分:2)

varchar(5) 

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

存储过程完全按照其中的内容完成。该错误在您的实现中。你的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