簡體   English   中英

如何在動態sql中使用變量設置where子句

[英]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) AB都為假時,它才是假的。

接下來,您可以將WHERE子句編寫為:

WHERE aa.pt <> 'Ins' OR aa.flag = 'Y'

Aaa.pt <> 'Ins'Baa.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM