在SQL Server中构建许多更新语句

时间:2013-12-26 14:17:12

标签: sql sql-server sql-update structure

我正在使用SQL Server。我也是以较强的方式编写SQL的新手。它主要是自学成才,因此我可能缺少适当格式的关键想法。

我有一个名为'SiteResources'的表和一个名为'ResourceKeys'的表。 SiteResources有一个整数,对应于字符串('siteid')的位置和'resourceid',它是一个整数id,对应于ResourceKeys中的'resourceid'。 ResourceKeys还包含它包含的每个键的字符串('resourcemessage')。基本上,这两个表负责表示字符串在网页上的存储和显示方式。

持续更新这两个表的最佳方法是什么?假设我在SiteResources中有5000行,在ResourceKeys中有1000行。我可以有一个excel表或一个小程序,它生成5000个单一的更新语句,如:

update SiteResources set resoruceid = 0 
WHERE siteid IS NULL AND resourceid IN (select resourceid 
from ResourceKeys where resourcemessage LIKE 'FooBar')

我可以拥有数以千计的单一更新语句,FooBar代表数据库中我可能想要立即更改的每个字符串,但是没有更清晰的方法来编写如此大量的更新语句?根据我的理解,我应该在begin / end / go中包含我的所有语句,只是在失败的情况下 - 这让我相信有更系统的方式来编写这些更新语句?我的预感是正确的吗?或者我正在寻找这种正确/理想的方式?我想,我可以改变我的表的结构,或者我存储数据的结构 - 这可能会简化事情 - 但是我只是说我不能这样做,在这种情况下。

3 个答案:

答案 0 :(得分:0)

让我看看我是否正确理解了这个问题。如果resourceid对应于字符串列表,您想将resourcemessage更新为0吗?如果是这样,您可以像这样建立您的查询。

UPDATE r 
SET resourceid = 0 
FROM SiteResources r
JOIN ResourceKeys k ON r.resourceid = k.resourceid
WHERE k.resourcemessage IN ('FooBar', ...)
AND r.siteid IS NULL;

这是在transact-sql中使用扩展的UPDATE语法,允许您在UPDATE语句中使用JOIN。但也许这不是你想要的?为什么在查询中使用LIKE运算符而没有通配符(%)?

答案 1 :(得分:0)

使用表值参数,您可以将表从客户端应用程序传递到应用程序提交以执行的SQL批处理。您可以使用此列表将需要更新的所有字符串列表传递给一次更新所有行的UPDATE

这样您就不必担心所有问题:更新次数,事务原子性,错误处理。作为奖励,性能将得到提升。

我建议你做一些关于TVP是什么以及如何使用它们的研究。

答案 2 :(得分:0)

据我了解,您只需要使用空参数'string of a string'更新表SiteResources中的所有内容。如果是这样,这里是代码:

UPDATE a 
SET resourceid = 0 
FROM SiteResources a
WHERE EXISTS (select * from ResourceKeys b where a.resourceid = b.resourceid) 
AND a.siteid IS NULL

对于某些特定内容,例如'FooBar'行,您可以像这样添加:

UPDATE a 
SET resourceid = 0 
FROM SiteResources a
WHERE EXISTS (select * from ResourceKeys b where a.resourceid = b.resourceid and b.resourcemessage IN ('FooBar', 'FooBar2', 'FooBar3', ...)) 
AND a.siteid IS NULL