2012-09-03 159 views
1
declare @pid int 
declare @mid int 
declare @tableName varchar(10) 
declare @query nvarchar(1000) 
declare @subquery nvarchar(300) 

set @pid = 1 
set @mid = 2 
set @query = 'Select * from '[email protected]+' where' 

if(@pid is not null) 
begin 
set @query = @query+' pid ='[email protected]+' and' 
end 

if(@mid is not null) 
begin 
set @query = @query+' mid ='[email protected]+' and' 
end 

如果@pid和@mid不空,都會進入這個query.If @pid和@mid空如何comapre 2串,我想從query.Same刪除「其中」爲'和',如果兩者都被選中。在執行查詢

set @subquery = select right('''[email protected]+''',5) 
if(@subquery = 'where') 
begin 
print @query 
-- execute sp_executesql @query 
end 

但無法比擬的,在如果clause.Does我需要EXCUTE @ subquery.If是,如何把該值。

+0

我忘了告訴TableName也是動態的,爲什麼我選擇執行sp_executesql @query。 – pinky

+0

@pinky,你也忘了回覆[mocha的評論](http://stackoverflow.com/questions/12245489/how-to-comapre-2-string-while-executing-the-query#comment16414042_12245489)? –

回答

2

如果@pid和@mid不爲空,則將其添加到查詢中。

如果@pid和@mid null,我想從查詢中刪除'where'。 都被選中。

我認爲你正在尋找的東西是這樣的:

WHERE 1 = 1 
    AND (@mid IS NULL OR mid = @mid) 
    AND (@pid IS NULL OR pid = @pid) 

如果@pid@midNULL秒,以前WHERE是:

WHERE 1 = 1 
    AND mid = @mid 
    AND pid = @pid 

因此它們得到補充進入查詢。

如果@pid@midNULL s,則WHERE條款將成爲:

WHERE 1 = 1 

因此它會像它不存在。

注意,我使用的情況下,WHERE 1 = 1兩個@pid@mid都是NULL秒,查詢是繼續工作,不打破。

+0

感謝Mahmoud,對於我的幫助。但我的表名也是動態的。這就是爲什麼我選擇sp_executesql.I創建了動態生成的查詢。 – pinky

+0

那有什麼問題呢?它應該與創建的動態生成的查詢一起工作。 –

+0

如果我的表名是動態的,我該如何從caluse寫入,這就是我選擇執行sp_executesql的原因。 – pinky