【发布时间】:2010-12-30 23:52:01
【问题描述】:
好的,第无数个条件列问题:
我正在编写一个存储过程,它接受一个映射到几个标志列之一的输入参数。过滤请求的列的最佳方法是什么?我目前正在使用 SQL2000,但即将迁移到 SQL2008,因此如果有可用的解决方案,我将采用现代解决方案。
sproc中查询到的表是这样的
ID ... fooFlag barFlag bazFlag quuxFlag
-- ------- ------- ------- --------
01 1 0 0 1
02 0 1 0 0
03 0 0 1 1
04 1 0 0 0
我想做类似的事情
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
所以如果我像 exec uspMyProc @flag = 'foo' 这样调用存储过程,我会返回第 1 行和第 4 行。
我知道我不能直接在 SQL 中完成括号中的部分。为了执行动态 SQL,我必须将整个查询填充到一个字符串中,连接 WHERE 子句中的 @flag 参数,然后执行该字符串。除了我在执行动态 SQL 时得到的肮脏感觉之外,我的查询相当大(我选择了几十个字段,连接 5 个表,调用了几个函数),所以它是一个很大的字符串,都是因为一行在 3 行 WHERE 过滤器中。
或者,我可以有 4 个查询副本,并在 CASE 语句中选择它们。这使得 SQL 代码可以直接执行(并且受到语法高亮等的影响),但代价是重复大量代码,因为我不能只在 WHERE 子句上使用 CASE。
还有其他选择吗?可以应用任何棘手的连接或逻辑操作吗?还是我应该克服它并执行动态 SQL?
【问题讨论】:
-
"exec uspMyProc @flag = 'foo' 我会回到第 1 行。"为什么只有第 1 行而不是第 4 行?
标签: tsql dynamic conditional where-clause