是否有办法编写强类型的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。
编辑:
看起来你可以做到,但你不应该这样做!绝对矫枉过正。测试显示执行计划的数字慢了一千倍。而且只有更大的结果集才会变慢。
答案 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一个由变量确定的条件。