关于存储过程的一个小问题2015-02-12今天一下午我就用来写这个存储过程了。遇到了好几个问题,现在解决了,就晒一晒,看看各位大牛有没有啥更好的办法,算是抛砖引玉吧。。。这个存储过程是我用来搜索拥有某种技能的用户的
存储过程create PROCEDURE [dbo].[selectuserbypageandsearch]@categoryid int,@sex int,@skillid int,@ishaved int,@pageindex int,@pagesize intASDECLARE @strSQL varchar(5000)declare @whereSQL varchar(1000)set @whereSQL="where 1=1 and dbo.Users.isskillopened=1"if @ishaved>0set @whereSQL=@whereSQL+"and dbo.Myskills.ishaved="+ltrim(STR(@ishaved))+""if @sex>=0 set @whereSQL =@whereSQL +" and dbo.Users.sex="+STR(@sex)+""if @skillid>0set @whereSQL =@whereSQL +" and dbo.Myskills.sid="+STR(@skillid)+""if @skillid<=0 and @categoryid>=0set @whereSQL =@whereSQL +" and dbo.Skills.categoryid="+STR(@categoryid)+""IF @pageindex = 1BEGINSET @strSQL ="SELECT DISTINCT TOP "+ STR(@pagesize) + "dbo.Users.id, dbo.Users.name, dbo.Users.nickname,dbo.Users.xuehaoFROMdbo.Myskills INNER JOINdbo.Skills ON dbo.Myskills.sid = dbo.Skills.id INNER JOINdbo.Users ON dbo.Myskills.uid = dbo.Users.id"+ STR(@whereSQL) + ""endELSEBEGINSET @strSQL ="SELECT DISTINCT TOP "+ STR(@pagesize) + "dbo.Users.id, dbo.Users.name, dbo.Users.nickname,dbo.Users.xuehaoFROMdbo.Myskills INNER JOINdbo.Skills ON dbo.Myskills.sid = dbo.Skills.id INNER JOINdbo.Users ON dbo.Myskills.uid = dbo.Users.id"+ STR(@whereSQL) + " and dbo.Users.id >(SELECT ISNULL(MAX([id]),0) FROM (SELECT TOP "+STR((@pageindex-1)*@pagesize)+" id FROM [User] "+ STR(@whereSQL) + " ORDER BY id) as A) ORDER by dbo.Users.id desc "endselect @strSQLEXEC(@strSQL)GO
写好之后,把它执行一下。。。。我使用的是下面的代码exec selectuserbypageandsearch 1,-1,0,0,1,10 果然有问题。。。。水平太菜。。。没办法。。错误显示的是消息 8114,级别 16,状态 5,过程 selectuserbypageandsearch,第 27 行从数据类型 varchar 转换为 float 时出错。好吧,我见过这个错误,那就修改它。。。(虽然我不知道为什么要这么改。。。)把
alter PROCEDURE [dbo].[selectuserbypageandsearch]@categoryid int,@sex int,@skillid int,@ishaved int,@pageindex int,@pagesize intASDECLARE @strSQL varchar(5000)declare @whereSQL varchar(1000)set @whereSQL="where dbo.Users.isskillopened=1"if @ishaved>0set @whereSQL=@whereSQL+"and dbo.Myskills.ishaved="+ltrim(STR(@ishaved))+""if @sex>=0 set @whereSQL =@whereSQL +" and dbo.Users.sex="+STR(@sex)+""if @skillid>0set @whereSQL =@whereSQL +" and dbo.Myskills.sid="+STR(@skillid)+""if @skillid<=0 and @categoryid>=0set @whereSQL =@whereSQL +" and dbo.Skills.categoryid="+STR(@categoryid)+""IF @pageindex = 1BEGINSET @strSQL ="SELECT DISTINCT TOP "+ STR(@pagesize) + "dbo.Users.id, dbo.Users.name, dbo.Users.nickname,dbo.Users.xuehaoFROMdbo.Myskills INNER JOINdbo.Skills ON dbo.Myskills.sid = dbo.Skills.id INNER JOINdbo.Users ON dbo.Myskills.uid = dbo.Users.id"+ Convert(varchar,@whereSQL) + ""--有@wheresql的都修改一下endELSEBEGINSET @strSQL ="SELECT DISTINCT TOP "+ STR(@pagesize) + "dbo.Users.id, dbo.Users.name, dbo.Users.nickname,dbo.Users.xuehaoFROMdbo.Myskills INNER JOINdbo.Skills ON dbo.Myskills.sid = dbo.Skills.id INNER JOINdbo.Users ON dbo.Myskills.uid = dbo.Users.id"+ Convert(varchar,@whereSQL) + " and dbo.Users.id >(SELECT ISNULL(MAX([id]),0) FROM (SELECT TOP "+STR((@pageindex-1)*@pagesize)+" id FROM [User] "+ Convert(varchar,@whereSQL) + " ORDER BY id) as A) ORDER by dbo.Users.id desc "endselect @strSQLEXEC(@strSQL)GO