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



我试图使下面的 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'

详细说明我的评论,您似乎不明白:

如果你有一个表达式,就像A OR B,如果(1)A为真而B为假,如果(2)A为假而B为真,或者如果(3)A为真而B为真,则该表达式将为真。只有当(4)AB都是假的时,它才是假的。

接下来,您可以将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'如何。如果aa.flag = 'Y'为假,则条件为真,当且仅当aa.pt <> 'Ins'为真,因为情况 (1)。否则,情况 (4) 适用,条件为假。

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

最新更新