关于SQL中IF语句的使用有关问题

关于SQL中IF语句的使用问题
本帖最后由 cyh027 于 2013-11-26 10:45:22 编辑
小弟写了一个分支添加过滤条件的语句,但是不知道为什么总是不能正常运行,自己找来找去不知道问题在哪里,请各位大大帮帮忙......



declare @sql_com nchar(100)
declare @sql_where nchar(70)
declare @jsbm nchar(3)
set @jsbm='aa'
set @sql_com='select * from tb1 where 1=1 '
set @sql_where ='' 
select @jsbm as '传回参数'
if (@jsbm = '')
begin
set @sql_where='无字符'
end
else
begin
set @sql_where=@sql_where +' and jsbm = @jsbm  '
end
set @sql_com=@sql_com + @sql_where
select @sql_where as '过滤条件'
select @sql_com as '命令部份' 


为什么就是得不到 ''select * from tb1 where 1=1 and jsbm = @jsbm  ',其中@sql_where 总是为'' ,感觉IF里面的代码就没有执行过。

------解决方案--------------------
DECLARE @sql_com NCHAR(100)
DECLARE @sql_where NCHAR(70)
DECLARE @jsbm NCHAR(3)
SET @jsbm = 'aa'
SET @sql_com = 'select * from tb1 where 1=1 '
SET @sql_where = '' 
SELECT  @jsbm AS '传回参数'
IF ( @jsbm = '' )
    BEGIN
        SET @sql_where = '无字符'
    END
ELSE
    BEGIN
        SET @sql_where = @sql_where + ' and jsbm = '+ @jsbm  
    END
SET @sql_com = @sql_com + @sql_where
SELECT  @sql_where AS '过滤条件'
SELECT  @sql_com AS '命令部份'
 
------解决方案--------------------
因为你的@sql_where类型是nchar(70),在赋值set @sql_where =''的时候会自动填满70个字符
所以再次set @sql_where=@sql_where +' and jsbm = @jsbm  '的时候还是只有70个空格

两个方法:
1:declare @sql_where nvarchar(70)
2:set @sql_where=rtrim(@sql_where) +' and jsbm = @jsbm  '
------解决方案--------------------
好像是NChar的问题,我改成varchar就可以了
DECLARE @sql_com  VARCHAR(100) 
DECLARE @sql_where  VARCHAR(70) 
DECLARE @jsbm VARCHAR(3) 
SET @jsbm = 'aa'
SET @sql_com = 'select * from tb1 where 1=1 '
SET @sql_where = '' 
SELECT  @jsbm AS '传回参数'
IF ( @jsbm = '' )     
BEGIN        
SET @sql_where = '无字符'    
END
ELSE    
BEGIN        SET @sql_where = @sql_where + ' and jsbm = '+ @jsbm       
END
SET @sql_com = @sql_com + @sql_where 
SELECT  @sql_where AS '过滤条件'
SELECT  @sql_com AS '命令部份' 
------解决方案--------------------

declare @sql_com nvarchar(100),@sql_where nvarchar(70),@jsbm nvarchar(3)

set @jsbm=N'aa'
set @sql_com=N'select * from tb1 where 1=1 '
set @sql_where=N''

if (@jsbm=N'')
begin
  set @sql_where=N'无字符'
end
else
begin
  set @sql_where=@sql_where+N' and jsbm=N'''+@jsbm+N''' '
end

set @sql_com=@sql_com+@sql_where

select @sql_where as '过滤条件'
select @sql_com as '命令部份' 

/*
过滤条件
----------------------------------------------------------------------
 and jsbm=N'aa' 


命令部份
-----------------------------------------------------------------------
select * from tb1 where 1=1  and jsbm=N'aa' 
*/

------解决方案--------------------
如果是2008r2,可以调试一下:

关于SQL中IF语句的使用有关问题
------解决方案--------------------

--try this
declare @sql_com VARCHAR(2000)
declare @sql_where VARCHAR(2000)
declare @jsbm VARCHAR(10)
set @jsbm='aa'
set @sql_com='select * from tb1 where 1=1 '