首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

存储过程里面怎么动态拼接sql语句,通过if语句?

2012-12-16 
存储过程里面如何动态拼接sql语句,通过if语句???现在有学生表,student,字段如下,stuid,stuname,stuage,stu

存储过程里面如何动态拼接sql语句,通过if语句???
现在有学生表,student,
字段如下,

stuid,stuname,stuage,stu_class_id,stumobile,stubirthday,stuaddress


现在想要拼接一条查询语句的存储过程。。

我想知道如果用户不输入某个查询条件是,存储过程里面该如何判断???

类似c#里面

string strsql = "select * from student where 1=1";
if(stuname!="")
{
 strsql += "and stuname link '%name%'";
}




自己尝试了一下,但还是不会。如下:


use testdb
go
if exists (select name from sysobjects where name='getStuList' and type='p')
drop procedure getStuList
go

create procedure getStuList
 @stuid int,
 @stuName nvarchar(50),
 @stuBirthday datetime 
 AS 
 declare @sql nvarchar(1000)
 set @sql='select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
 from Student as s where 1=1'
 if @stuid!=null 
 begin 
set @sql = @sql+'and s.stuid='+@stuid 
 end 
 EXEC(@sql)
go 


感觉“set @sql = @sql+'and s.stuid='+@stuid ”怎么也不会执行,请教一下,,谢谢!!!
[最优解释]
先别exec,先print @sql看看出来什么,然后先别放到存储过程里面,先从sql语句调试
[其他解释]
传入空值时也可以直接一句话拼成

select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
from Student as s where 1=1 AND ISNULL(@stuid,s.stuid) = s.stuid AND ISNULL(@stuname,s.stuname) = s.stuname

[其他解释]
引用:
先别exec,先print @sql看看出来什么,然后先别放到存储过程里面,先从sql语句调试


谢谢!!!
[其他解释]
 select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
 from Student as s where 1=1 
[其他解释]
我不是很想帮你把东西都完完全全写好,不然你就算有进步,恐怕都慢的要命。还是先自己学会调试吧。实在不行再问
[其他解释]
好像搞定了。。。


use testdb
go
if exists (select name from sysobjects where name='getStuList' and type='p')
drop procedure getStuList
go

create procedure getStuList
 @stuid int,
 @stuName nvarchar(50),
 @stuBirthday datetime 
 AS 
 declare @sql nvarchar(1000)
 set @sql=' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
 from Student as s where 1=1 '
 if(@stuid is not null)
 begin 
set @sql = @sql+' and s.stuID='+convert(nvarchar,@stuid) + ' '
 end 
 
 if(@stuName is not null)
 begin
set @sql = @sql+' and s.stuName like ''%'+@stuName +'%'''
 end
 print (@sql)
go 

------其他解决方案--------------------


引用:
我不是很想帮你把东西都完完全全写好,不然你就算有进步,恐怕都慢的要命。还是先自己学会调试吧。实在不行再问


谢谢你!!!
[其他解释]
edure getStuListgo create ……[/quote]

引用:
我不是很想帮你把东西都完完全全写好,不然你就算有进步,恐怕都慢的要命。还是先自己学会调试吧。实在不行再问


麻烦你帮我看下这样写好不好,或者说哪儿有错误,我不是很确定。。

例如那个if(@stuid is not null)判断是不是null值对不???

前台有5个查询条件,我打算都这样拼接起来,因为这些参数是必须填写的,所以我打算都用是否为null值类判断,这样好不???
[其他解释]
if  @stuid is not null
或者
if isnull(@stuid,'')<>''--这个判断参数非空字符串或者null值
[其他解释]
引用:
if  @stuid is not null
或者
if isnull(@stuid,'')<>''--这个判断参数非空字符串或者null值


哦,好的,谢谢。。

还有一个问题请教,datetime类型怎么转换呢???


use testdb
go
if exists (select name from sysobjects where name='getStuList' and type='p')
drop procedure getStuList
go

create procedure getStuList
 @stuid int,
 @stuName nvarchar(50),
 @stuBirthday datetime 
 AS 
 declare @sql nvarchar(1000)
 set @sql=' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
 from Student as s where 1=1 '
 if(@stuid is not null)
 begin 
set @sql = @sql+' and s.stuID='+convert(nvarchar,@stuid) + ' '
 end 
 
 if(@stuName is not null) 
 begin 
set @sql = @sql+' and s.stuName like ''%'+@stuName +'%'' ' 
 end 
 
 if(@stuBirthday is not null)
 begin
set @sql = @sql+' and s.stuBirthday>=CONVERT(datetime,'''+@stuBirthday +''',''yyyy-MM-dd hh24:mi:ss'')' 
 end
 print (@sql) 
go 


老是报:

消息 241,级别 16,状态 1,过程 getStuList,第 22 行
从字符串转换日期和/或时间时,转换失败。
[其他解释]
你要转换成什么格式?
Select CONVERT(varchar(100), GETDATE(), 0)--05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1)--05/16/06 Select CONVERT(varchar(100), GETDATE(), 2)--06.05.16 Select CONVERT(varchar(100), GETDATE(), 3)--16/05/06 Select CONVERT(varchar(100), GETDATE(), 4)--16.05.06 Select CONVERT(varchar(100), GETDATE(), 5)--16-05-06 Select CONVERT(varchar(100), GETDATE(), 6)--16 05 06 Select CONVERT(varchar(100), GETDATE(), 7)--05 16, 06 Select CONVERT(varchar(100), GETDATE(), 8)--10:57:46 Select CONVERT(varchar(100), GETDATE(), 9)--05 16 200610:57:46:827AM Select CONVERT(varchar(100), GETDATE(), 10)--05-16-06 Select CONVERT(varchar(100), GETDATE(), 11)--06/05/16 Select CONVERT(varchar(100), GETDATE(), 12)--060516 Select CONVERT(varchar(100), GETDATE(), 13)--16 05 2006 10:57:46:937 Select CONVERT(varchar(100), GETDATE(), 14)--10:57:46:967 Select CONVERT(varchar(100), GETDATE(), 20)--2006-05-16 10:57:47 Select CONVERT(varchar(100), GETDATE(), 21)--2006-05-16 10:57:47.157 Select CONVERT(varchar(100), GETDATE(), 22)--05/16/06 10:57:47 AM Select CONVERT(varchar(100), GETDATE(), 23)--2006-05-16 Select CONVERT(varchar(100), GETDATE(), 24)--10:57:47 Select CONVERT(varchar(100), GETDATE(), 25)--2006-05-16 10:57:47.250 Select CONVERT(varchar(100), GETDATE(), 100)--05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 101)--05/16/2006 Select CONVERT(varchar(100), GETDATE(), 102)--2006.05.16 Select CONVERT(varchar(100), GETDATE(), 103)--16/05/2006 Select CONVERT(varchar(100), GETDATE(), 104)--16.05.2006 Select CONVERT(varchar(100), GETDATE(), 105)--16-05-2006 Select CONVERT(varchar(100), GETDATE(), 106)--16 05 2006 Select CONVERT(varchar(100), GETDATE(), 107)--05 16, 2006 Select CONVERT(varchar(100), GETDATE(), 108)--10:57:49 Select CONVERT(varchar(100), GETDATE(), 109)--05 16 200610:57:49:437AM Select CONVERT(varchar(100), GETDATE(), 110)--05-16-2006 Select CONVERT(varchar(100), GETDATE(), 111)--2006/05/16 Select CONVERT(varchar(100), GETDATE(), 112)--20060516 Select CONVERT(varchar(100), GETDATE(), 113)--16 05 2006 10:57:49:513 Select CONVERT(varchar(100), GETDATE(), 114)--10:57:49:547 Select CONVERT(varchar(100), GETDATE(), 120)--2006-05-16 10:57:49 Select CONVERT(varchar(100), GETDATE(), 121)--2006-05-16 10:57:49.700 Select CONVERT(varchar(100), GETDATE(), 126)--2006-05-16T10:57:49.827 Select CONVERT(varchar(100), GETDATE(), 130)--18 ???? ?????? 142710:57:49:907AM Select CONVERT(varchar(100), GETDATE(), 131)--18/04/142710:57:49:920AM 


[其他解释]
SELECT  CONVERT(VARCHAR(100), GETDATE(), 0)
 --05 16 2006 10:57AM SELECT  CONVERT(VARCHAR(100), GETDATE(), 1)
 --05/16/06 SELECT  CONVERT(VARCHAR(100), GETDATE(), 2)
 --06.05.16 SELECT  CONVERT(VARCHAR(100), GETDATE(), 3)
 --16/05/06 SELECT  CONVERT(VARCHAR(100), GETDATE(), 4)
 --16.05.06 SELECT  CONVERT(VARCHAR(100), GETDATE(), 5)
 --16-05-06 SELECT  CONVERT(VARCHAR(100), GETDATE(), 6)
 --16 05 06 SELECT  CONVERT(VARCHAR(100), GETDATE(), 7)
 --05 16, 06 SELECT  CONVERT(VARCHAR(100), GETDATE(), 8)
 --10:57:46 SELECT  CONVERT(VARCHAR(100), GETDATE(), 9)
 --05 16 200610:57:46:827AM SELECT  CONVERT(VARCHAR(100), GETDATE(), 10)
 --05-16-06 SELECT  CONVERT(VARCHAR(100), GETDATE(), 11)
 --06/05/16 SELECT  CONVERT(VARCHAR(100), GETDATE(), 12)
 --060516 SELECT  CONVERT(VARCHAR(100), GETDATE(), 13)
 --16 05 2006 10:57:46:937 SELECT  CONVERT(VARCHAR(100), GETDATE(), 14)
 --10:57:46:967 SELECT  CONVERT(VARCHAR(100), GETDATE(), 20)
 --2006-05-16 10:57:47 SELECT  CONVERT(VARCHAR(100), GETDATE(), 21)
 --2006-05-16 10:57:47.157 SELECT  CONVERT(VARCHAR(100), GETDATE(), 22)
 --05/16/06 10:57:47 AM SELECT  CONVERT(VARCHAR(100), GETDATE(), 23)
 --2006-05-16 SELECT  CONVERT(VARCHAR(100), GETDATE(), 24)
 --10:57:47 SELECT  CONVERT(VARCHAR(100), GETDATE(), 25)
 --2006-05-16 10:57:47.250 SELECT  CONVERT(VARCHAR(100), GETDATE(), 100)
 --05 16 2006 10:57AM SELECT  CONVERT(VARCHAR(100), GETDATE(), 101)
 --05/16/2006 SELECT  CONVERT(VARCHAR(100), GETDATE(), 102)
 --2006.05.16 SELECT  CONVERT(VARCHAR(100), GETDATE(), 103)
 --16/05/2006 SELECT  CONVERT(VARCHAR(100), GETDATE(), 104)
 --16.05.2006 SELECT  CONVERT(VARCHAR(100), GETDATE(), 105)
 --16-05-2006 SELECT  CONVERT(VARCHAR(100), GETDATE(), 106)
 --16 05 2006 SELECT  CONVERT(VARCHAR(100), GETDATE(), 107)
 --05 16, 2006 SELECT  CONVERT(VARCHAR(100), GETDATE(), 108)
 --10:57:49 SELECT  CONVERT(VARCHAR(100), GETDATE(), 109)
 --05 16 200610:57:49:437AM SELECT  CONVERT(VARCHAR(100), GETDATE(), 110)
 --05-16-2006 SELECT  CONVERT(VARCHAR(100), GETDATE(), 111)
 --2006/05/16 SELECT  CONVERT(VARCHAR(100), GETDATE(), 112)
 --20060516 SELECT  CONVERT(VARCHAR(100), GETDATE(), 113)
 --16 05 2006 10:57:49:513 SELECT  CONVERT(VARCHAR(100), GETDATE(), 114)
 --10:57:49:547 SELECT  CONVERT(VARCHAR(100), GETDATE(), 120)
 --2006-05-16 10:57:49 SELECT  CONVERT(VARCHAR(100), GETDATE(), 121)
 --2006-05-16 10:57:49.700 SELECT  CONVERT(VARCHAR(100), GETDATE(), 126)
 --2006-05-16T10:57:49.827 SELECT  CONVERT(VARCHAR(100), GETDATE(), 130)


 --18 ???? ?????? 142710:57:49:907AM SELECT  CONVERT(VARCHAR(100), GETDATE(), 131)--18/04/142710:57:49:920AM


[其他解释]
这新版的编辑器真烂....
[其他解释]
引用:
这新版的编辑器真烂....


默认格式

2012-08-19 00:00:00.000
[其他解释]
引用:
引用:这新版的编辑器真烂....

默认格式

2012-08-19 00:00:00.000


我想拼接成stubirthday>=某个时间
[其他解释]
Select CONVERT(varchar(100), GETDATE(), 121)--2006-05-16 10:57:49.700  
[其他解释]
引用:
传入空值时也可以直接一句话拼成

select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
from Student as s where 1=1 AND ISNULL(@stuid,s.stuid) = s.stuid AND ISNULL(@stuname,s.stu……


谢谢,这个小技巧不错不错。。
[其他解释]
引用:
Select CONVERT(varchar(100), GETDATE(), 121)--2006-05-16 10:57:49.700


还是错,我把调用都发出来吧。。


use testdb
go
if exists (select name from sysobjects where name='getStuList' and type='p')
drop procedure getStuList
go

create procedure getStuList
 @stuid int,
 @stuName nvarchar(50),
 @stuBirthday datetime 
 AS 
 declare @sql nvarchar(1000)
 set @sql=N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
 from Student as s where 1=1 '
 if(@stuid is not null)
 begin 
set @sql = @sql+' and s.stuID='+convert(nvarchar,@stuid) + ' '
 end 
 
 if(@stuName is not null) 
 begin 
set @sql = @sql+' and s.stuName like ''%'+@stuName +'%'' ' 
 end 
 
 if(@stuBirthday is not null)
 begin
set @sql = @sql+' and s.stuBirthday>=CONVERT(varchar(100),'''+@stuBirthday +''',121)' 
 end
 print (@sql) 
go 

exec getStuList null,'张三','2012-10-11 12:11:11'




[其他解释]
引用:
DECLARE @sql NVARCHAR(1000)
     SET @sql = N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
      from Student as s where 1=1 '
     IF ( @stuid IS NOT NULL ) 
……


还是不行,打印出来结果。


 select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 


      from Student as s where 1=1  and s.stuName like '%张三%'  and s.stuBirthday>=CONVERT(varchar(100),'
                 + @stuBirthday + ',121)


[其他解释]

     DECLARE @sql NVARCHAR(1000)
     SET @sql = N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
      from Student as s where 1=1 '
     IF ( @stuid IS NOT NULL ) 
         BEGIN 
             SET @sql = @sql + ' and s.stuID=' + CONVERT(NVARCHAR, @stuid)
                 + ' '
         END 
       
     IF ( @stuName IS NOT NULL ) 
         BEGIN 
             SET @sql = @sql + ' and s.stuName like ''%' + @stuName + '%'' ' 
         END 
       
     IF ( @stuBirthday IS NOT NULL ) 
         BEGIN
             SET @sql = @sql + ' and s.stuBirthday>=CONVERT(varchar(100),''
                 + @stuBirthday + '',121)' 
         END
     PRINT ( @sql ) 
[其他解释]

 if exists (select name from sysobjects where name='getStuList' and type='p')
 drop procedure getStuList
 go
  
 create procedure getStuList
      @stuid int,
      @stuName nvarchar(50),
      @stuBirthday datetime     
      AS 
      declare @sql nvarchar(1000)
      set @sql=N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
      from Student as s where 1=1 '
      if(@stuid is not null)
      begin 
         set @sql = @sql+' and s.stuID='+convert(nvarchar,@stuid) + ' '
      end 
       
      if(@stuName is not null) 
      begin 


         set @sql = @sql+' and s.stuName like ''%'+@stuName +'%'' ' 
      end 
       
      if(@stuBirthday is not null)
      begin
         set @sql = @sql+' and s.stuBirthday>='+CONVERT(VARCHAR(30),@stuBirthday,121)
      end
      print (@sql) 
 go 
  
 exec getStuList null,'张三','2012-10-11 12:11:11'

 
[其他解释]
引用:
引用:DECLARE @sql NVARCHAR(1000)
     SET @sql = N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
      from Student as s where 1=1 '
……


@stuBirthday仍然没有被替换掉。。。
[其他解释]
引用:
SQL code?12345678910111213141516171819202122232425262728293031 if exists (select name from sysobjects where name='getStuList' and type='p') drop procedure getStuList go    create procedur……


恭喜呀!!!

[其他解释]
引用:
引用:DECLARE @sql NVARCHAR(1000)
     SET @sql = N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
      from Student as s where 1=1 '
……


搞定了,太不小心了,关键的转换在

set @sql = @sql+' and s.stuBirthday>='''+ CONVERT(nvarchar(25),@stuBirthday,121) +'''' 
[其他解释]
弄好了就行,多调试,特别对动态sql,先print了在exec
[其他解释]

use testdb
go
if exists (select name from sysobjects where name='getStuList' and type='p')
drop procedure getStuList
go

create procedure getStuList
 @stuid int,
 @stuName nvarchar(50),
 @stuBirthday datetime 
 AS 
 /*
  DECLARE @sql NVARCHAR(1000)
     SET @sql = N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
      from Student as s where 1=1 '
     IF ( @stuid IS NOT NULL ) 
         BEGIN 
             SET @sql = @sql + ' and s.stuID=' + CONVERT(NVARCHAR, @stuid)
                 + ' '
         END 
       


     IF ( @stuName IS NOT NULL ) 
         BEGIN 
             SET @sql = @sql + ' and s.stuName like ''%' + @stuName + '%'' ' 
         END 
       
     IF ( @stuBirthday IS NOT NULL ) 
         BEGIN
             SET @sql = @sql + ' and s.stuBirthday>='''+convert(nvarchar(25),@stuBirthday)+''''
         END
     PRINT ( @sql )  */
 
 declare @sql nvarchar(1000)
 set @sql=N' select s.stuID,s.stuName,s.stuSex,s.stuBirthday,s.stuAddress,s.stu_class_id 
 from Student as s where 1=1 '
 if(@stuid is not null)
 begin 
set @sql = @sql+' and s.stuID='+convert(nvarchar,@stuid) + ' '
 end 
 
 if(@stuName is not null) 
 begin 
set @sql = @sql+' and s.stuName like ''%'+@stuName +'%'' ' 
 end 
 
 if(@stuBirthday is not null)
 begin
set @sql = @sql+' and s.stuBirthday>='''+ CONVERT(nvarchar(25),@stuBirthday,121) +'''' 
 end
 print (@sql) 
go 

exec getStuList null,'张三','2012-10-11 12:11:11'

热点排行
Bad Request.