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

Iva*_*nov 2 sql aggregate sql-server-2005 sql-server-2008

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

就像是:

SELECT SUM( Column0 ) FROM Table1
GROUP BY @MyVar
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下方法:

SELECT SUM( Column0 ) FROM Table1
GROUP BY CASE @MyVar WHEN 'Column1' THEN Column1 ELSE Column2
Run Code Online (Sandbox Code Playgroud)

第二条语句仅适用于 Column1 和 Column2 的数据库类型相同的场景。如果它们不是 SQL 引擎,则会抛出类似于以下内容的错误:“将 nvarchar 值 'SYSTEM' 转换为数据类型 [The Different TYPE] 时,转换失败。”

我能做些什么来获得强大的结果集,同时又拥有一些动态的部分——即我的情况下的石斑鱼?这将暴露给 LINQ。

编辑:

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

gbn*_*gbn 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)