2009-11-23 59 views
1

有没有办法编写SQL Server存储过程,它是强类型的(即返回已知的列结果集)并使其语句组成为动态的。SQL Server 2005/2008组使用参数的语句不使用动态SQL?

喜欢的东西:

SELECT SUM(Column0) FROM Table1 
GROUP BY @MyVar 

我试过下面还有:

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

第二条语句只能在场景中的DB类型的列1和列2是相同的。如果它们不是,则SQL引擎会抛出类似于以下内容的错误:“将nvarchar值'SYSTEM'转换为数据类型[The TYPE TYPE]时转换失败。”

我可以做些什么来实现强大的结果集,但还有一些动态的部分 - 即我的案例中的石斑鱼?这将暴露给LINQ。

编辑:

看起来你可以做到,但你不应该!绝对是过度杀伤。测试显示数千倍的执行计划。只有在更大的结果集时它才会变慢。

回答

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 
+0

+1整齐!我即将说这是不可能的......你每天都在继续学习新的东西! – 2009-11-23 16:44:38

+0

@Ivan:好的,我应该分组NULL.Please看我的更新。 – gbn 2009-11-23 18:18:09

+0

我明白了。谢谢。 – 2009-11-23 18:22:23

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计划一个由变量决定的条件。

+0

别管我以前的评论。经过一些测试,我完全同意你的看法。你可以做到,但你不应该这样做。虽然你是正确的,但这不是实际问题的答案。我赞成你顺便说一句。 – 2009-11-23 18:18:13