0

我正在使用 SQL Server,在下面的查询中,我有一个问题。当我在列表中执行位置时,我不确定左侧的字段是否会与右侧的字段(来自同一个表)一起更新。

update loc 
set locShortName = locName 
where locid in (3,4,11,13,14,15,16,18,19,20,21,24,32,41,45,68,69,77,82,85)

update loc set locShortName = locName where locid = 3 (move to next record in the list)      
update loc set locShortName = locName where locid = 4 (move to next record in the list)
update loc set locShortName = locName where locid = 11(move to next record in the list)

等等...

我认为它将采用列表中的第一个数字并解决字段值设置,然后移至列表中的下一个。

我的预期正确吗?

提前致谢。

4

4 回答 4

2

这在我看来是正确的。每当我像这样编写一次性更新查询时,我总是首先在表的副本上对其进行测试。

于 2012-10-31T18:47:37.607 回答
0
update loc set locShortName = locName where locid in 
(3,4,11,13,14,15,16,18,19,20,21,24,32,41,45,68,69,77,82,85)

你可以认为它是这样工作的:

排一排。如果 locid 在列表中,将获取该行的 locName 并将其放入 locShortName。

换一排。如果 locid 在列表中,将获取该行的 locName 并将其放入 locShortName。

换一排。如果 locid 不在列表中,它不会做任何事情。

等等

它不会一次处理一个,但概念结果将是这样的

于 2012-10-31T18:47:37.110 回答
0

您的期望几乎是正确的,它不是一次处理一条记录,而是处理整套记录。它会提取 locid = ... 的记录,然后一举将 locShortname 字段更新为每条记录中的 locname 字段。在编写 SQl 代码时,您永远不应该考虑处理单个记录,而只考虑处理记录集。

于 2012-10-31T18:54:15.827 回答
0

前两个答案并不正确,它将读取和更新单个隐式事务中的所有记录(以查询开始和结束)。查询的更新部分将映射来自同一记录的“locShortName”和“locName”值。

我发现知道要更新什么的最简单方法是编写更新查询,如下所示。完成后,我通常会删除副作用语法。

--update l
--set locShortName = locName 
select locShortName = locName
from loc as l
where locid in (3,4,11,13,14,15,16,18,19,20,21,24,32,41,45,68,69,77,82,85);

正如我所说,当您完成时,要么删除选择行并取消注释更新/设置行,要么删除副作用语法。如果您还想加入其他表,这种格式会很有用。

只需确保每次更改 select 语句时,都对 update 语句进行相应的更改(即使已注释)。

当您不确定查询的结果时,另一个好的做法是开始一个事务,以便您可以检查其产生的更改和行数。然后,您可以根据需要提交或回滚事务。我只是警告它会锁定那些行或表,所以不要在活动系统中逗留太久。

于 2012-10-31T18:57:40.897 回答