SQL Server 2005/2008 Group By语句,带参数,不使用动态SQL?
是否有一种方法可以编写强类型的SQL Server存储过程(即返回已知的列结果集)并使其group语句为动态的 比如: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类型相同
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!我正要说这根本不可能。。。。你每天都在学习新的东西@伊凡:好的,我应该分组为空。请看我的更新。不要介意我之前的评论。经过一些测试,我完全同意你的看法。你可以做,但你不应该。虽然你是对的,但这并不是实际问题的答案。顺便说一句,我投票给你。