VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 688|回复: 7

求解一个多条件中确定每一个条件是否为空然后决定进行哪一步操作的存储过程

[复制链接]

3

主题

17

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
发表于 2020-1-4 10:10:01 | 显示全部楼层 |阅读模式
有一个存储过程有3个输入参数,分别是@companname,@startdate,@enddate;代表的是公司名称,开始时间,结束时间,现在的要求是:
这3个参数各都有为空和不为空二种状态,组合起来就有N种结果,如果一条条写出来,应该比较麻烦,求高手看一下如何写出这种存储过程。

下面这个是全部不为空的写法
————————————————————————————————————
            select 公司id,公司名称,sum(金额) as 总额 from
                  (
                   select * from 1 where 请求时间 < @enddate and 请求时间 > @startdate
                   union all
                   select * from 2 where 请求时间 < @enddate and 请求时间 > @startdate
                  ) t where 审批意见='同意' and 公司名称=@companyname
           group by 公司id,公司名称 order by 公司id
————————————————————————————————————


下面这个是全部为空的写法
————————————————————————————————————
            select 公司id,公司名称,sum(金额) as 总额 from
                  (
                   select * from 1                  
                   union all
                   select * from 2                   ) t where 审批意见='同意'            group by 公司id,公司名称 order by 公司id
————————————————————————————————————

可能还需要注意的是要判断开始时间和结束时间是否正确,请高手帮个忙吧!
回复

使用道具 举报

0

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-1-4 10:12:01 | 显示全部楼层
用动态SQL。

如:

declare @p1 int, @p2 int, @p3 int, @sql varchar(8000)

set @sql ='select * from 表名 where 1=1 '
if @p1 is not null
    set @sql = @sql + ' and 字段1= ' + cast(@p1 as varchar(100))

if @p2 is not null
    set @sql = @sql + ' and 字段1= ' + cast(@p2 as varchar(100))

if @p3 is not null
    set @sql = @sql + ' and 字段1= ' + cast(@p3 as varchar(100))

exec (@sql)

回复

使用道具 举报

0

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-1-4 10:18:01 | 显示全部楼层
如:

declare @p1 int, @p2 int, @p3 int, @sql varchar(8000)

set @sql ='select * from 表名 where 1=1 '
if @p1 is not null
    set @sql = @sql + ' and 字段1= ' + cast(@p1 as varchar(100))

if @p2 is not null
    set @sql = @sql + ' and 字段2= ' + cast(@p2 as varchar(100))

if @p3 is not null
    set @sql = @sql + ' and 字段3= ' + cast(@p3 as varchar(100))

exec (@sql)
回复

使用道具 举报

0

主题

23

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-1-4 10:21:02 | 显示全部楼层

动态sql语句基本语法
1 :普通SQL语句可以用Exec执行

eg:   Select * from tableName
         Exec('select * from tableName')
         Exec sp_executesql N'select * from tableName'    -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:   
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName              -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName')     -- 请注意 加号前后的 单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s)                -- 成功
exec sp_executesql @s   -- 此句会报错



declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s)                -- 成功     
exec sp_executesql @s   -- 此句正确

3. 输出参数
declare @num int,
        @sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?

declare @num int,
               @sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num

回复

使用道具 举报

3

主题

17

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-1-4 11:09:01 | 显示全部楼层
有点晕,并且我实在搞不清楚我的语句的结构要如何写
回复

使用道具 举报

3

主题

17

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-1-4 11:15:01 | 显示全部楼层
再顶,谢谢楼上的大哥,比较头疼
回复

使用道具 举报

2

主题

6

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-4 14:12:01 | 显示全部楼层
顶一下,高手看一下吧!
回复

使用道具 举报

3

主题

17

帖子

11.00

积分

新手上路

Rank: 1

积分
11.00
 楼主| 发表于 2020-1-5 15:48:01 | 显示全部楼层
求高手出招吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表