[英]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.