2011-04-26 59 views
2

我有大約10個不同的sql語句更新不同的表。他們看起來類似於這樣的:SQL僅在條件上加入?

Update Y 
SET x = n 
Where something = @somevar 

現在我只需要更新@hasRows var時設置的某些行。我可以簡單地這樣做:

if not @hasRows is null 
begin 
    Update Y  
    SET x = n 
    from Y inner join #items on y.Item = #items.Item 
    Where something = @somevar 
end 
else 
begin 
    Update Y 
    SET x = n 
    Where something = @somevar 
end 

有沒有辦法避免if/else並在一個語句中進行更新?

我正在使用SQL2005。

+0

n如何在#items上加入? – 2011-04-26 21:05:13

+0

@Nitin n不會改變。該更新僅更新使用內部聯接匹配的項目。我們的目標是更新#items和Y中存在的全部或者全部內容。 – vikasde 2011-04-26 21:07:01

+0

無論如何,如果您想要更新所有行,您將如何讓@items包含所有行?無論如何,這將允許您使用內部連接更新查詢。 – Nik 2011-04-26 21:08:48

回答

1

也許是這樣的:(copypasta你的例子)

UPDATE Y  
SET x = n 
FROM Y 
WHERE something = @somevar 
AND (
    (@Items IS NULL) 
    OR (y.Item = @Item) 
    ) 

JOIN不使用,但它一直在繼續,如果@itemsNULL,或者使用預期的條件。

這裏的問題在於,您的示例似乎包含TVP @ITEMS,但TVPER不存在於SQLServer2k5中?所以無論值是什麼都應該放在參數中。

另外,如果#Table 存在,但沒有行,你可以這樣做:

UPDATE Y  
SET x = n 
FROM Y 
JOIN #Items ON (@HasRows = 0) OR (#Items.Item = Y.Item) 
WHERE something = @somevar 

如果你不知道要不要#Items IS NULL那麼你的條件是你的選擇,因爲聲明的變量被解決之前該聲明被執行。

+0

假設我有一個不同的變量來確保#items表中填充了行@HasRows - 現在如果@HasRows爲true,則使用連接,否則不要。 – vikasde 2011-04-26 21:19:00

+0

@vikasde這在SQLServer中是不可能的。你不能在一個語句中創建一個'JOIN'條件。你只能使'JOIN'的參數有條件。所以,你可以'加入'#items @ ON @ HasRows' – Matthew 2011-04-26 21:20:59

+0

就是這樣。作品。我測試了它。謝謝。 – vikasde 2011-04-26 21:25:13