[英]how to set where clause with variable in dynamic sql
我試圖使下面的 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 雜技(這很可能無論如何都不起作用,因為您在構建字符串時不知道這些值,因此無法決定在那里放置什么子句)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.