今天写了一个简单的存储过程,但是确因为一个小问题怎么也不能得到正确的结果。今天记下来,希望能提醒健忘的自己和帮助那些可能被这些小而容易忽略的问题弄得郁闷的人们。
下面列举出来的就是我的存储过程执行的对象表的表结构。
username varchar (50) (Primary Key)
password varchar (50)
其中username是表的主键。在表中存在一条记录如下:
username password
vividboy 123456
下面就是出错的存储过程:
ALTER PROCEDURE dbo.GetUserInfoByName
(
/**/ /*@paramName [paramType]*/
@username varchar -- 这里必须是数据库的类型,比如这里没有string型对应的可以选择varchar,char型等。
)
AS
SELECT username, roles FROM users WHERE username = @username
RETURN
在调用的时候,我传入"vividboy",正常的结果应该是找到一条记录。但是实际情况是,没有找到任何记录。
在 查询分析器 中测试存储过程的时候,发现@username的属性为varchar(1),这样我的原意是username="vividboy"但由于@username默认的类型是varchar(1),长度不够,那么实际上就是@username="v",那么在表格中没有这个记录,自然就没有返回值了。将@username varchar 修改成 @username varchar(50)然后再进行测试,结果正常。修改后存储过程是:
(
/**/ /*@paramName [paramType]*/
@username varchar( 50 ) -- 这里必须是数据库的类型,比如这里没有string型对应的可以选择varchar,char型等。
)
AS
/**/ /* SET NOCOUNT ON */
SELECT username, roles FROM users WHERE username = @username
RETURN
GO
P.S. 这里还顺带的说一下。很多时候我们打开SQL查询分析器,不小心关掉了左边的“对象浏览器”,要重新打开对象浏览器,仅需要“工具”--> “对象浏览器” --> “显示/隐藏”就可以了。
【注】这里要谢谢我两位可爱的学弟 弋政 和 肖海军