SELECT语句检索的SELECT SQL表

时间:2010-02-15 09:53:02

标签: sql-server tsql sql-server-2000 if-statement dynamic-sql

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。所以我需要一些其他方式。

3 个答案:

答案 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上的索引,这显然不理想(反之亦然)。