看到原来项目的存储过程判断一层套一层,而我则想要尽量简化,于是网查到下面的写法,也是缘分,开始就看到了这个比较简单的写法,但是思路很新颖,用到了coalesce(返回其参数中的第一个非空表达式),如果是空,就不返回了。如果不用这个,那么为空的变量也在SQL语句中,将会执行错误。
最初看到这个代码很高兴,copy来试验,但是确报错,+''' 有错误,于是用了一般的语句,包含了变量,发现字符串变量在SQL中要加上引号:'@bzw ',如果和其他字符串连接,就要再加', 成为这样:''+@bzw+'',如果外层还有引号,则,这里就变成:'''+@bzw+'''.
终于好了,时间字段的初值成了问题,最后发现,传入的那个变量其实是个字符串型,不是时间型。
总算过关!看来,相信自己,从小处开始试验,总能找到强大难题的突破口!!!
ALTER PROCEDURE dbo.HnMessage
(
--是否处理标志,1:已处理
@bzw char(1)=null,
--报警日期
@sasj2begin nvarchar(80)=null,
@sasj2end nvarchar(80)=null,
--报警电话
@barlxdh7 nvarchar(80)=null,
--接电人
@cjr1 nvarchar(50)=null,
--报警类型
@ajly4 nvarchar(200)=null,
--登录用户所在单位
@departname varchar(50)=null
)
AS
declare @sql nvarchar(4000)
set @sql=coalesce(@sql, ' ')+
( ' bzw = '''+@bzw+''' and ', ' ') +
coalesce( ' sasj2 >= '''+@sasj2begin+''' and ', ' ')+
coalesce( ' sasj2 <= '''+@sasj2end+''' and ', ' ')+
coalesce( ' barlxdh7='''+@barlxdh7+ ''' and ', ' ')+
coalesce( ' cjr1='''+@cjr1+ ''' and ', ' ')+
coalesce( ' ajly4='''+@ajly4+ ''' and ', ' ')+coalesce( ' cjdw1 = '''+@departname+''' or ', ' ')+
coalesce( ' bzw = '''+@bzw+''' and ', ' ') +
coalesce( ' sasj2 >= '''+@sasj2begin+''' and ', ' ')+
coalesce( ' sasj2 <= '''+@sasj2end+''' and ', ' ')+
coalesce( ' barlxdh7='''+@barlxdh7+ ''' and ', ' ')+
coalesce( ' cjr1='''+@cjr1+ ''' and ', ' ')+
coalesce( ' ajly4='''+@ajly4+ ''' and ', ' ')+coalesce( ' cjdw2 = '''+@departname+''' and ', ' ')
if len(@sql)> 0 set @sql= ' where '+left(@sql,len(@sql)-4)
--打印出来自己看吧
print @sql
set @sql= 'SELECT [BH0], [ID], [BARXM5], [BARDWHZZ8], [SASJ2], [BARLXDH7],'+
'[FXSJ10], [AJLY4], [ss_ajdl], [ss_ajnb], [JYAQ39], [duty_name],'+
'[ldps], [DXCADDMAN], [cjsj2], [cjdw2], [cjsj1], [cjdw1], [ss_ajyy],'+
'[AJCLQK], [ysbm], [sldw], [CJJG], [SDCJR], [NEW_FADD], [ss_faqy], [cjr1], [cjr2] FROM [DXC_BJAJDJB20] '+@sql
exec(@sql)
联系客服