读书人

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

发布时间: 2012-12-16 12:02:32 作者: rapoo

存储过程里面如何动态拼接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'

读书人网 >SQL Server

热点推荐