SQL Server 2005/2008 Group By语句带参数而不使用动态SQL?

时间:2009-11-23 16:30:15

标签: sql sql-server-2005 sql-server-2008 aggregate

是否有办法编写强类型的SQL Server存储过程(即返回已知的列结果集)并使其group语句为动态。

类似的东西:

SELECT SUM( Column0 ) FROM Table1
GROUP BY @MyVar

我也尝试了以下内容:

SELECT SUM( Column0 ) FROM Table1
GROUP BY CASE @MyVar WHEN 'Column1' THEN Column1 ELSE Column2

第二个语句仅适用于Column1和Column2的db类型相同的情况。如果它们不是SQL引擎则抛出一个类似于以下内容的错误:“将nvarchar值'SYSTEM'转换为数据类型[不同类型]时转换失败。”

我能做些什么才能获得强大的结果并且还有一些动态的部分 - 即我的情况下的石斑鱼?这将暴露给LINQ。

编辑:

看起来你可以做到,但你不应该这样做!绝对矫枉过正。测试显示执行计划的数字慢了一千倍。而且只有更大的结果集才会变慢。

2 个答案:

答案 0 :(得分:4)

您可以对可能有用的常量进行分组

SELECT
    SUM(Column0),
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE '' END AS MyGrouping
FROM
    Table1
GROUP BY
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE '' END

编辑:对于数据类型不匹配和多个值,这允许您对两个列进行分组...

SELECT
    SUM(Column0),
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE NULL END AS Column1,
    CASE @MyVar WHEN 'Column2' THEN Column2 ELSE NULL END AS Column2
FROM
    Table1
GROUP BY
    CASE @MyVar WHEN 'Column1' THEN Column1 ELSE NULL END,
    CASE @MyVar WHEN 'Column2' THEN Column2 ELSE NULL END

答案 1 :(得分:2)

你准备射击自己,并要求更大的子弹。

唯一合理的方法是将IF分成T-SQL流控制语句:

IF (0 = @MyVar)
 SELECT SUM(Column0) FROM Table1 GROUP BY Column1;
ELSE IF (1 = @MyVar)
  SELECT SUM(Column0) FROM Table1 GROUP BY Column2;
ESLE IF (2 = @myVar)
  SELECT SUM(Column0) FROM Table1 GROUP BY Column3;

您希望查询优化器最后一件事是生成一个计划,该计划必须由GROUP BY一个由变量确定的条件。