一个mvc的项目,领导要求用存储过程,不在代码里出现任何sql语句,除了存储过程名称,无奈,硬着头皮上吧。
写了一个超简单的,可是愣是没有输出值,怎么查询是空,代码如下:
ALTER PROCEDURE [dbo].[proc_BasicMain_ProvinceByName]
@pname nvarchar
AS
BEGIN
select id ,provinceName from dbo.BasicMain_Province where provinceName=@pname
END
各种郁闷,,,然后,群里问网友,大神给出主意:参数类型可能和provinceName字段的类型不匹配,遂改,结果ok了。各种感谢啊,激动,然后在群里说:是类型的问题,改成一致的类型就o了,,,(我还以为我发现真理了,其实不然)改完之后,代码如下:
ALTER PROCEDURE [dbo].[proc_BasicMain_ProvinceByName]
@pname nchar(10)
AS
BEGIN
select id ,provinceName from dbo.BasicMain_Province where provinceName=@pname
END
没过多大会儿,大牛出来指正我的错误观念,那个nvarchar字段,如果不指定长度,默认长度为1,把传进来的参数截断了,肯定查不出来数据了,除非为它指定长度,原来如此。。。我这个水平啊,真心不敢恭维。
总结下:
参数类型最好和数据库字段保持一致,避免出错,如果不能保持一致,也最好为类型设置长度。
继续补充中,,,
一:
如下写存储过程,可以返回受影响的行数
CREATE PROCEDURE proc_BasicMain_SchoolTypeDelete
@id int
AS
declare @ReturnId int
BEGIN
delete from dbo.BasicMain_SchoolType where id=@id
END
select @ReturnId=@@Rowcount
select @ReturnId
GO
个人理解是:先声明一个输出对象:declare @ReturnId int,然后再存储过程代码结束处为该临时输出对象赋值:select @ReturnId=@@Rowcount,然后输出:select @ReturnId
二:
使用存储过程实现模糊查询: like格式必须如此: '%' + @tName + '%'
CREATE PROCEDURE proc_BasicMain_SchoolTypeLikeName
@tName nvarchar(50)
AS
BEGIN
select id,typeName,addTime from dbo.BasicMain_SchoolType where typeName like '%' + @tName + '%'
END
GO
三:
直接插入一条数据,并返回该数据的ID:
ALTER PROCEDURE [dbo].[proc_BasicMain_SchoolTypeAdd]
@tName nvarchar(50),
@aTime Datetime
AS
BEGIN
insert into dbo.BasicMain_SchoolType(typeName,addTime) values(@tName,@aTime) select @@IDENTITY
END
四:
多条件查询的sql存储过程:需要注意的地方:rtrim(@sId) 因为@sId是个int类型,在sql中不能和字符串直接拼接,所以需要做转换,即:rtrim(@sId) 后再相加即可。
[貌似,这个rtrim()函数在转换@sId的过程中,同时把它转换成字符串类型了,所以,就对了。(不知道我这么理解对不,,)]
(真得感谢群里的网友,那么帮助我,感激涕零啊。。。不是他们,我现在还在迷茫呢)
CREATE PROCEDURE proc_BasicMain_UserInfoByParam
@lName nvarchar(50),
@tName nvarchar(50),
@sId int
AS
BEGIN
declare @sql nvarchar(500)
set @sql='select dbo.BasicMain_UserInfo.id,userName,RealName,pwd,dbo.BasicMain_School.schoolName From dbo.BasicMain_School INNER JOIN
dbo.BasicMain_UserInfo ON dbo.BasicMain_School.id = dbo.BasicMain_UserInfo.schoolID where 1=1 '
if @lName!=''
set @sql=@sql+' and userName like ''%' +@lName+ '%'''
if @tName!=''
set @sql=@sql+' and RealName like ''%'+@tName+ '%'''
if @sId<>0
set @sql=@sql+' and schoolID='+rtrim(@sId)
exec (@sql)
END