将列作为变量传递给T-SQL中的存储过程

时间:2010-12-06 19:33:39

标签: tsql

我对构建一个基于另一个表中的表行值返回SELECT语句的存储过程的最佳方法感到有点困惑。

问题可能最好描述如下:

Table Name: reportValues
--------------------------------------------
ID       name       date        region
--------------------------------------------
1        Stefan     2010-01-01  UK
2        David      2010-01-05  SE
3        Anna       2010-01-12  NO
4        Marie      2010-01-15  NO


Table Name: reportParameters
-------------------------------
ID       column     queryValue 
-------------------------------
1        ID       
2        name     
3        date       
4        region     

根据用户在queryValue表的reportParameters列中输入的内容,我想构建一个执行SELECT语句的存储过程,如下所示:

SELECT * FROM reportValues WHERE region = 'NO' 

如果用户输入了以下值:

Table Name: reportParameters
-------------------------------
ID       column     queryValue 
-------------------------------
1        ID       
2        name       
3        date       
4        region     NO

但它可能也是:

SELECT * FROM reportValues WHERE region = 'NO' AND name = 'Anna'

如果用户输入了:

Table Name: reportParameters
-------------------------------
ID       column     queryValue 
-------------------------------
1        ID       
2        name       Anna
3        date       
4        region     NO

我最初的想法是创建一个循环,将SELECT语句构造成一个字符串变量并执行它。但它必须是一个更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我不确定是否有,如果查询有一个小的,已知的字段集,那么你可以在伴随选择器的地方列出所有字段:

(IF NOT NULL reportParameters.field AND reportParameters.field = reportValues.field)

没有短路评估,但它可能仍然具有预期的效果。否则,它将归结为动态SQL和EXEC()

答案 1 :(得分:0)

您可以使用CASE构造条件WHERE子句。见this close to the bottom of the article.