在SQL Server中按指定的参数动态选择和分组

时间:2015-12-16 18:55:37

标签: sql sql-server

我正在尝试在存储过程中创建可选参数,在该过程中,我在特定条件下按参数分组。

例如:

SELECT
    TP.ProductID,
    case 
        when @passangers='Y'     then (TP.Passangersgroup)
        when @fareclass='Y'      then (TP.Fareclass)
        when @ispriorbooking='Y' then (TP.IsPriorBooking)
    end
INTO ##B
FROM ##A TP
GROUP BY  
    TP.ProductID, 
    case 
        when @passangers='Y'     then (TP.Passangersgroup)
        when @fareclass='Y'      then (TP.Fareclass)
        when @ispriorbooking='Y' then (TP.IsPriorBooking)
    end

在这种情况下,我可以选择' Y'对于3个参数中的任何一个,我想将它们添加到select语句和group by。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您需要使用动态SQL执行此操作;类似的东西:

declare @sql varchar(max) = 'SELECT
    TP.ProductID, ' + 
    case when @passangers='Y' then 'TP.Passangersgroup'
    when @fareclass='Y' then 'TP.Fareclass'
    when @ispriorbooking='Y' then 'TP.IsPriorBooking'
else ''        
end
+ ' INTO ##B
FROM ##A TP'
--ETC

Exec(@sql)

如果要添加到所有三列,则需要三个案例语句:

declare @sql varchar(max) = 'SELECT
    TP.ProductID, ' + 
    case when @passangers='Y' then 'TP.Passangersgroup' else '' end
    + case when @fareclass='Y' then 'TP.Fareclass' else '' end
--ETC.
+ ' INTO ##B
FROM ##A TP'

答案 1 :(得分:0)

动态SQL将是最好的选择,但我会找出你想要的列,然后将一列作为变量传递。不太可能遭受SQL注入并且更易读。

DECLARE @passangers CHAR(1), @fareclass CHAR(1), @ispriorbooking CHAR(1)
SET @passangers='Y'

DECLARE @SQLCMD NVARCHAR(MAX), @YValue NVARCHAR(1000)

--set the select and group by field
SELECT @YValue=
    case 
        when @passangers='Y' then N'TP.Passangersgroup'
        when @fareclass='Y' then N'TP.Fareclass'
        when @ispriorbooking='Y' then N'TP.IsPriorBooking'
        else NULL
    end

IF @YValue IS NOT NULL
BEGIN
    SET @SQLCMD=N'
    SELECT
    TP.ProductID,'+@YValue+'
    INTO ##B
    FROM ##A TP
    GROUP BY  
        TP.ProductID, '+@YValue

    PRINT @SQLCMD
    --EXEC sp_executesql @SQLCMD
END
ELSE
    PRINT 'INVALID PARAMETER PASSED IN'

答案 2 :(得分:0)

你必须使用动态sql,但是当选择多个列为'Y'时,Steve Mangiameli代码中提到的case语句将不起作用。以下代码适用于选择为“Y” -

的多个列
create procedure proc1
@passangers varchar(100) = null,
@fareclass varchar(100) = null,
@ispriorbooking varchar(100) = null
as
begin
declare @sql nvarchar(100)
declare @var varchar(100)

if @passangers = 'y'
set @var = tp.Passangersgroup + ', '
if @fareclass = 'y'
set @var = @var + TP.Fareclass + ', '
if @ispriorbooking = 'y'
set @var = @var + TP.IsPriorBooking


set @sql =  'select ' + @var + ' into ##b from ##a as TP group by  ' + @var + 'option(recomplile)'

exec sp_executesql @sql
end