我正在尝试在存储过程中创建可选参数,在该过程中,我在特定条件下按参数分组。
例如:
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。
有什么想法吗?
答案 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