将两个值传递给存储过程?

时间:2014-05-18 14:29:37

标签: sql sql-server sql-server-2008 stored-procedures

我编写了一个存储过程,在每次提供日期值的链接上调用,@ 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

1 个答案:

答案 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