Hella all,
我想做的就是这样,我将根据我的参数设置一个SQL表,
DECLARE @find varchar(30)
SET @find = 'no'
SELECT * FROM
(
if @find = 'yes'
(
SELECT * FROM myTable
WHERE ID= '5882'
)
ELSE
(
SELECT * FROM myTable
WHERE OLD_ID= '5882'
)
) X
这只是一个简单的表,我举了一个例子,我真正的sql查询要大得多,所以我不认为我可以在这个查询中使用动态sql。所以我需要一些其他方式。
答案 0 :(得分:1)
使用“搜索CASE
函数”,如下所示:
WHERE
CASE
WHEN @find = 'no' THEN ID
WHEN @find = 'yes' THEN OLD_ID
-- put an ELSE clause here
-- if you want to catch @find not being no or yes
END
= '5882'
答案 1 :(得分:0)
您可以使用EXEC执行SQL字符串。你必须记住引号。
DECLARE @column varchar(max);
SET @column = 'OLD_ID'
EXEC('SELECT * FROM myTable WHERE ' + @column + ' = ''5882''')
答案 2 :(得分:0)
为确保最佳执行计划,我建议创建单独的查询,并根据“@find”调用相应的查询。 例如 SPROC1将查询ID SPROC2将查询OLD_ID
然后,或者,改变你的调用代码来调用适当的sproc,或者,如果你只想将@find作为参数传递,那么创建一个仅作为重定向的第3个sproc: SPROC3:
IF (@find = 'no')
EXECUTE SPROC1
ELSE IF (@find = 'yes')
EXECUTE SPROC2
ELSE
....
其他方法的风险是执行计划污染,即为一条路径创建计划(例如@ find ='no'),然后当后续调用带有@ find ='yes'时,它最终会使用远程执行计划不太合适,导致性能不佳。换句话说,不是在ID上使用索引,而是最终可能使用OLD_ID上的索引,这显然不理想(反之亦然)。