我创建了一个存储过程,它接受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'
我们得到相同的结果
答案 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