如何在动态SQL中使用变量设置where子句

时间:2018-12-28 15:23:48

标签: sql dynamic

我试图在下面使where子句更加灵活,即,当表'aa'中的FLAG列等于'Y'时,where子句等于'where 1 = 1'。如何添加到下面的动态SQL中?

DECLARE @WhereClause NVARCHAR(300) = N' WHERE aa.pt <> ''Ins'' ';


SET @Sql = 
'insert into '+ @DbName  
+ ' ([TimeStamp], RECORD_ID, CREATED) 
'+ 'select 
        GetDate()
        , aa.RECORD_ID
        , aa.CREATED
    from #TempAudit aa 
    LEFT JOIN [' + @tableName + '] bb on aa.RECORD_ID = bb.ROW_ID 
    ' + @WhereClause

为了进一步阐明,我要实现的是,当aa.FLAG = Y时,我不再需要条件'aa.pt <>'Ins'。类似于下面的内容,但我认为该格式不起作用。

DECLARE @WhereClause NVARCHAR(300) = N' WHERE aa.pt <> ''Ins'' ';
 DECLARE @WhereClause2 NVARCHAR(300) = N' WHERE 1=1';
SET @Sql = 
'insert into '+ @DbName  
+ ' ([TimeStamp], RECORD_ID, CREATED) 
'+ 'select 
        GetDate()
        , aa.RECORD_ID
        , aa.CREATED
    from #TempAudit aa 
    LEFT JOIN [' + @tableName + '] bb on aa.RECORD_ID = bb.ROW_ID 
    ' + 'case when aa.FLAG = ''Y'' then @WhereClause2  else @WhereClause'

1 个答案:

答案 0 :(得分:0)

要详细说明我的评论,您似乎看不懂:

如果您有一个表达式,类似于A OR B,则如果(1)A为true,B为false,则表达式为true,如果(2){{1 }}为假,A为真,或者(3)B为真且A为真。只有BA都为假时,才是假。

随后,您可以将B子句写为:

WHERE

此处将WHERE aa.pt <> 'Ins' OR aa.flag = 'Y' 设为A,将aa.pt <> 'Ins'设为B。如果aa.flag = 'Y'为真,则无论aa.flag = 'Y'为何,都适用情况(2)或(3)并且条件为真。如果aa.pt <> 'Ins'为false,则由于情况(1),且仅当aa.flag = 'Y'为true时,条件为true。否则,情况(4)适用且条件为假。

这正是您要实现的逻辑。它只是在这里不使用任何动态SQL杂技(很可能无论如何都不会起作用,因为您在构建字符串时不知道值,因此无法决定在其中放置什么子句)。