Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 更新sql server表中的前1条记录_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 更新sql server表中的前1条记录

Sql server 更新sql server表中的前1条记录,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我的问题 UPDATE TOP (1) TX_Master_PCBA SET TIMESTAMP2 = '2013-12-12 15:40:31.593' WHERE SERIAL_NO IN ('0500030309') ORDER BY TIMESTAMP2 DESC 对于TX\u Master\u PCBA表中的serial\u No列,我有10条记录,但我想将最新的TIMESTAMP2更新为当前日期时间 上述查询正在抛出错误: 关键字“TOP”附近的语法不正确 当TOP与INS

我的问题

UPDATE TOP (1) TX_Master_PCBA  
SET TIMESTAMP2 = '2013-12-12 15:40:31.593'
WHERE SERIAL_NO IN ('0500030309') 
ORDER BY TIMESTAMP2 DESC 
对于
TX\u Master\u PCBA
表中的
serial\u No
列,我有10条记录,但我想将最新的
TIMESTAMP2
更新为当前日期时间

上述查询正在抛出错误:

关键字“TOP”附近的语法不正确


TOP
INSERT
UPDATE
MERGE
DELETE
一起使用时,引用的行不会按任何顺序排列,并且不能在这些语句中直接指定order BY子句。如果需要使用TOP按有意义的时间顺序插入、删除或修改行,则必须将
TOP
与subselect语句中指定的
order BY
子句一起使用

TOP
不能用于分区视图上的
UPDATE
DELETE
语句


TOP
不能与同一查询表达式(在同一查询范围内)中的
OFFSET
FETCH
组合。有关更多信息,请参见

Kapil的公认答案有缺陷,如果有2条或多条记录具有相同的时间戳,它将更新多条记录,而不是真正的前1条查询

    ;With cte as (
                    SELECT TOP(1) email_fk FROM abc WHERE id= 177 ORDER BY created DESC   
            )
    UPDATE cte SET email_fk = 10

参考Remus Rusanu Ans:-

对于那些正在寻找线程安全解决方案的人,请看一看

代码:

它也很有效

Update t
Set t.TIMESTAMP2 = '2013-12-12 15:40:31.593'
From
(
    Select Top 1 TIMESTAMP2
    From TX_Master_PCBA
    Where SERIAL_NO IN ('0500030309')
    Order By TIMESTAMP2 DESC
) t

虽然问题是SQL-SERVER,但对于谁搜索MySql解决方案,有一种更简单更快的方法
更新TX_Master_PCBA SET TIMESTAMP 2=NOW(),其中SERIAL_NO='05030309'按时间戳排序DESC LIMIT 1
@TomerW-life saver,谢谢。甚至都没想过做个极限!节省了我的时间,TY如果我想在此处使用Join并从该表中设置值,该怎么办?+1用于线程安全,尽管当
AccountId
不唯一时,您将不得不在中提到的cte中工作,以仅获取一条记录。我发现此SP更新了所有记录,因此我将顶行设置为此更新帐户顶部(1)干得好!非常感谢。
    ;With cte as (
                    SELECT TOP(1) email_fk FROM abc WHERE id= 177 ORDER BY created DESC   
            )
    UPDATE cte SET email_fk = 10
UPDATE Account 
SET    sg_status = 'A'
OUTPUT INSERTED.AccountId --You only need this if you want to return some column of the updated item
WHERE  AccountId = 
(
    SELECT TOP 1 AccountId 
    FROM Account WITH (UPDLOCK) --this is what makes the query thread safe!
    ORDER  BY CreationDate 
)
Update t
Set t.TIMESTAMP2 = '2013-12-12 15:40:31.593'
From
(
    Select Top 1 TIMESTAMP2
    From TX_Master_PCBA
    Where SERIAL_NO IN ('0500030309')
    Order By TIMESTAMP2 DESC
) t