我试图在下面使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'
答案 0 :(得分:0)
要详细说明我的评论,您似乎看不懂:
如果您有一个表达式,类似于A OR B
,则如果(1)A
为true,B
为false,则表达式为true,如果(2){{1 }}为假,A
为真,或者(3)B
为真且A
为真。只有B
和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'
为false,则由于情况(1),且仅当aa.flag = 'Y'
为true时,条件为true。否则,情况(4)适用且条件为假。
这正是您要实现的逻辑。它只是在这里不使用任何动态SQL杂技(很可能无论如何都不会起作用,因为您在构建字符串时不知道值,因此无法决定在其中放置什么子句)。