我编写了一个存储过程,在每次提供日期值的链接上调用,@ cg为NULL,以便在特定日期过滤结果。
DECLARE @return_value int
EXEC @return_value = [dbo].[Get_Mydata]
@cg = NULL,
@tosearch = '15-05-2014'
SELECT 'Return Value' = @return_value
GO
首次执行存储过程后,它会提供一些结果并使用相同的存储过程。
我需要通过传递下面的参数来过滤结果,所以这次@cg
是非空的。
DECLARE @return_value int
EXEC @return_value = [dbo].[Get_Mydata]
@cg = 'CUSTOMER NAME',
@tosearch = 'manish'
SELECT 'Return Value' = @return_value
GO
我无法确定如何创建动态where子句并将其添加到现有查询以及如何将值传递给已作为日期传递的相同参数。
更像是先获取特定日期的结果,然后对该结果应用类似的过滤器。我无法传递前端开发人员要求的不同参数。
这是我的存储过程和表数据。 http://sqlfiddle.com/#!3/bb917
create proc Get_Mydata
(
@cg varchar(50),
@tosearch varchar(50)
)
as
begin
set nocount on
declare @sqlquery nvarchar(max)
set @sqlquery = N'select q_no, trandate, cust_name from testsp where CONVERT(Date, trandate, 103) = CONVERT(Date, ''' + @tosearch + ''' ,103)';
create table #temp1
(
q_no int,
trandate datetime,
cust_name varchar(50)
)
insert into #temp1(q_no, trandate, cust_name)
exec (@sqlquery)
select * from #temp1 as T;
set nocount off
end
答案 0 :(得分:0)
我所理解的是,当您将null传递给@cg
param并希望在将字符串'Cust_Name'
传递给@时过滤Cust_name上的结果时,您希望存储过程在Date列上过滤结果Cg Param。
它应该相当简单,但是在任何情况下你都不需要一个临时表来获得结果它只是过度杀死一个相当简单的查询。
我会这样做......
将列名称传递给@ColumnName
参数,将值传递给@tosearch
参数。它将根据您传递的值构建查询。
确保将值(列名称)传递给@ColumnName
。
create proc Get_Mydata
(
@ColumnName varchar(50),
@tosearch varchar(50)
)
as
begin
set nocount on;
declare @sqlquery nvarchar(max);
set @sqlquery = N' select q_no, trandate, cust_name '
+ N' from testsp '
+ N' where ' + QUOTENAME(@ColumnName) + N' = '
+ CASE
WHEN @ColumnName = 'trandate'
THEN N' CAST(@tosearch AS DATE)'
WHEN @ColumnName = 'cust_name'
THEN N' @tosearch'
ELSE N'' END
EXECUTE sp_executesql @sqlquery
,N'@tosearch varchar(50)'
,@tosearch
set nocount off;
end