2011-04-26 53 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