0

大家好,

我想要做的就是这样,我将根据我的参数有一个 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。所以我需要一些其他的方法。

4

3 回答 3

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'
于 2010-02-15T10:12:53.430 回答
0

您可以使用 EXEC 来执行 SQL 字符串。你必须注意引号。

DECLARE @column varchar(max);
SET @column = 'OLD_ID'

EXEC('SELECT * FROM myTable WHERE ' + @column + ' = ''5882''')
于 2010-02-15T10:06:32.640 回答
0

为确保最佳执行计划,我建议创建单独的查询,并根据“@find”调用适当的查询。例如,SPROC1 将查询 ID SPROC2 将查询 OLD_ID

然后,更改您的调用代码以调用适当的存储过程,或者,如果您只想将@find 作为参数传递,创建一个仅充当重定向的第三个存储过程:SPROC3:

IF (@find = 'no')
    EXECUTE SPROC1
ELSE IF (@find = 'yes')
    EXECUTE SPROC2
ELSE
    ....

其他方法的风险是执行计划污染,即为一条路径创建计划(例如@find='no'),然后当后续调用以@find='yes' 进入时,它最终会使用不太合适的执行计划,导致业绩不佳。换句话说,它可能最终使用 OLD_ID 上的索引而不是使用 ID 上的索引,这显然不是理想的(反之亦然)。

于 2010-02-15T10:31:56.223 回答