簡體   English   中英

通過SQL Server中的指定參數動態選擇和分組

[英]Dynamically selecting and grouping by specified parameters in 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

在這種情況下,我可以為3個參數中的任何一個選擇'Y',並且我想將它們添加到select語句和group by中。

有任何想法嗎?

您需要使用動態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)

如果您希望將所有三列加起來,則需要三個case語句:

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'

動態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'

您必須使用動態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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM