2013-08-01 185 views
4

试图根据另一个字段将订单列插入某些记录。通常在MySQL中不是问题,但在SQL Server中,我无法完全理解这里的语法。SQL Server:使用变量增加INT列

这是我:我的

DECLARE @a int 
SET @a = 1 

UPDATE tablename 
SET order_position = @a:[email protected]+1 
WHERE table_id = xxx 

但部分认为这正在下降,而不是一个一个的功能/程序的路线命中UPDATE查询。

对不起,我把它写成了一个MySQL数据库的人,不熟悉SQL Server的变量,所以可能会有点不对。

我需要在记录一个个的负载运行此,我想order_position列是1-7(其中有7条记录)等。

谢谢,克里斯

+0

订单基于什么字段? –

+0

那么我需要在更新它们之前预定结果,以便它们按正确的顺序排列。为了本练习的目的,我们将其称为'场地'。 – Chris

回答

11

试试这个代码:

DECLARE @a int 
SET @a = 1 
UPDATE tablename SET order_position = @a, @[email protected]+1 WHERE table_id = xxx 

你正试图做一个双重任务这是问题。 "order_position = @a:[email protected]+1"有2种解释,一种是你知道的,另一种是递增a的结果,它成功的是order_position值。

+0

是的,尽管在这样做后,我意识到更新的行的顺序可能无法按正确的顺序,所以我需要做某种功能。但很高兴知道。 – Chris

+0

我有一个扩展的问题,我有一个包含“ArticleId,ViewCount”的数百万条记录的表格。每次用户查看文章时,我都会更新该文章的viewCount。一次可能有200个查看文章的请求,这意味着200个更新Count表上的查询。我会覆盖哪些性能问题?有没有其他最好的方法来完成这个? – HaBo

+0

多次更新可能导致死锁和其他可能成为问题的竞争条件。快照可能是缓慢读取的解决方法,但仍会产生其他问题。 –

4

将变量从字段更新中分离出来。

DECLARE @a int 
SET @a = 1 
UPDATE tablename 
SET order_position = @a 
    ,@a = @a + 1 
WHERE table_id = xxx 

来自MySQL您可能会忽略这项任务的一个很棒的工具,ROW_NUMBER()

可以使用ROW_NUMBER()到多个表中的分配给每一行:

SELECT *,ROW_NUMBER() OVER (PARTITION BY .... ORDER BY ....) 
FROM Table 

PARTITION BY指示分组的编号,即,会出现一个“1”,在PARTITION BY使用的字段的每一种组合,并且它们当然将根据ORDER BY条款从1-n进行排序。

+0

谢谢,我知道它必须是简单的东西。干杯。 – Chris