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

SQL Server 2005/2008 Group By语句,带参数,不使用动态SQL?,sql,sql-server-2005,sql-server-2008,aggregate,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 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

编辑:


看起来你能做到,但你不应该!绝对是过火了。测试显示,执行计划的速度要慢上千倍。结果集越大,速度就越慢。

你可以根据一个可能有用的常数分组

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

你准备向自己的脚开枪,并要求一颗更大的子弹

唯一合理的方法是将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;

您最不希望查询优化器生成一个计划,该计划必须根据由变量确定的条件进行分组。

+1!我正要说这根本不可能。。。。你每天都在学习新的东西@伊凡:好的,我应该分组为空。请看我的更新。不要介意我之前的评论。经过一些测试,我完全同意你的看法。你可以做,但你不应该。虽然你是对的,但这并不是实际问题的答案。顺便说一句,我投票给你。