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

动态sql增强有关问题

2013-09-14 
动态sql增强问题以下为相关表以及sp: Create table Table_3 (id int, date1 date, score int)insert into

动态sql增强问题
以下为相关表以及sp:

 Create table Table_3 (id int, date1 date, score int)
insert into table_3 select 1, '2013-09-01',1 union all select 2,'2013-09-02',2
union all select 3,'2013-09-02', 2 union all select 4,'2013-09-02', 2 union all select 5,'2013-09-03', 3  union all select 6,'2013-09-03', 4
go

create proc usp_test @TableName varchar(100), @field varchar(50), @filter varchar(300), @func varchar(10)
as
begin
Declare @sql nvarchar(max)
declare @filterSql varchar(200)

if(@filter !='')
begin
set @filterSql = ' and '+@filter
end

set @sql = 'select '+ @field+','+@func + '(score) from '+ @TableName + ' where 1=1 ' + @filterSql + ' group by '+@field
exec sp_executesql @sql
End
go
usp_test 'Table_3','date1', 'Convert(date, Date1) =''2013-09-02''','sum' 

以前的输入参数,第3个参数输入为常量'2013-09-02',如 Convert(date, Date1) ='2013-09-02',现在添加功能为此sp还要识别嵌套函数比如Convert(date, Date1) =Maximum(date1), 或Convert(date, Date1) =Maximum() 注意不只限于Max,可能为min 等其他聚合函数,在保留原功能基础上,请问如何修改呢?
即现在要支持的4种功能
usp_test 'Table_3','date1', 'Convert(date, Date1) =''2013-09-02''','sum'
usp_test 'Table_3','date1', 'Convert(date, Date1) =Maximum(date1)','sum'  
usp_test 'Table_3','date1', 'Convert(date, Date1) =Max()' ,'sum'
usp_test 'Table_3','date1', 'Minimum(date1) =Convert(date, Date1)' ,'sum' --参数颠倒顺序
谢谢!

[解决办法]

usp_test 'Table_3','date1', 'Convert(date, Date1) =(select MAX(Date1) from Table_3)','sum'  

[解决办法]

use test
 Create table Table_3 (id int, date1 datetime, score int)
insert into table_3 select 1, '2013-09-01',1 


union all select 2,'2013-09-02',2
union all select 3,'2013-09-02', 2 
union all select 4,'2013-09-02', 2 
union all select 5,'2013-09-03', 3  
union all select 6,'2013-09-03', 4
go

alter proc usp_test @TableName varchar(100), @field varchar(50), @filter varchar(300), @func varchar(10)
as
begin
Declare @sql nvarchar(max)
declare @filterSql varchar(200)
declare @filter1 varchar(200),@filter2 varchar(200)
if len(@filter )>0
begin
        set @filter1=left(@filter,charindex('=',@filter)-1)
        set @filter2=right(@filter,len(@filter)-charindex('=',@filter)+1)
       if charindex('convert',@filter1)>0
begin
set @filter1= 'and '+@filter1
set @filter2='=(select '+@filter2+' from '+@tablename+')'
end
else
begin
set @filter1= 'and (select '+@filter1+' from '+@tablename+')'
set @filter2='='+@filter2
end
end
set @filterSql=@filter1+@filter2
set @sql = 'select '+ @field+','+@func + '(score) from '+ @TableName + ' where 1=1 ' + @filterSql + ' group by '+@field
print @sql
exec sp_executesql @sql
End
go
usp_test 'Table_3','date1', 'Convert(datetime, Date1)=Max(date1) ','sum' 


[解决办法]
先把能够执行的 SQL 写出来,然后再考虑如何传参数到存储过程,在里面生成SQL。
有聚合函数的 SQL 语句结构是不一样的。

热点排行