我试图使下面的 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)A
和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'
如何。如果aa.flag = 'Y'
为假,则条件为真,当且仅当aa.pt <> 'Ins'
为真,因为情况 (1)。否则,情况 (4) 适用,条件为假。
这正是你想要实现的逻辑。它只是在这里不使用任何动态SQL杂技(这很可能无论如何都不起作用,因为您在构建字符串时不知道值,因此无法决定将哪个子句放在那里)。