针对两个更新和搜索查询的高效SQL查询

针对两个更新和搜索查询的高效SQL查询,sql,sql-server,search,sql-update,Sql,Sql Server,Search,Sql Update,我有这样一个问题: SELECT TOP 1 ID, DATA, OTHERINF FROM MYTABLE WHERE DATE = @DATE 在读取行数据并使用它之后,我想更新检索到的行并更改其中一列(在另一个事务中) 但正如你在这里看到的,我搜索了那一排两次。是否有任何方法可以让我记住行并在不再次搜索的情况下进行更新 多谢各位 --Note, need to setup proper data types DECLARE @Id INT DECLARE @Data VARCHAR(MA

我有这样一个问题:

SELECT TOP 1 ID, DATA, OTHERINF FROM MYTABLE WHERE DATE = @DATE
在读取行数据并使用它之后,我想更新检索到的行并更改其中一列(在另一个事务中)

但正如你在这里看到的,我搜索了那一排两次。是否有任何方法可以让我记住行并在不再次搜索的情况下进行更新

多谢各位

--Note, need to setup proper data types
DECLARE @Id INT
DECLARE @Data VARCHAR(MAX)
DECLARE @OtherInf VARCHAR(max)

SELECT TOP 1 @id = Id, @Data = Data, @OtherInf = OtherInf
FROM MyTable
WHERE Date = @Date

--Now you can do what you need, using the info above.

在第一次查询中,您检索到了id。在第二次查询中,使用它查找要更新的行,而不是使用日期:

UPDATE MYTABLE
SET DATA = 'FooBar'
WHERE ID = 200

您可以将UPDATE和SELECT合并到一个语句中,但不能跨两个事务。因此,如果您需要更新另一个事务中的值而不是选择它(原因我不清楚),您需要两条语句。

我假设日期列没有索引(如果没有,为什么没有?),那么最好的办法是确保您检索到主键(不是该ID吗?)然后将其用作更新中的条件

我知道这已经过时了,但你也可以在光标上进行定位更新 e、 g


请注意,这假定ID是PK或至少是索引的。+1只要您保留索引列,就不需要搜索。但这样我应该在ID上有一个索引。有更好的方法吗?您的ID没有索引?您的表没有主键吗?有一个主键是更好的方法。主键是否意味着在该列上有一个索引?但我想要一种不搜索两次的方法。您的解决方案只是提供了信息,而不是解决问题的方法。您注意到您希望在另一个事务中使用该信息,因此,我假设您进行了中间处理。根据您给出的评论,我认为这个问题需要重新处理,以说明您正试图实现的目标,从而最大限度地提高效率。指向该行的某种指针,可以轻松更改该行。游标是否保留在不同事务之间?游标在关闭或连接关闭之前保持打开状态。所以这在很大程度上取决于你。请注意,2005在游标中添加了本地和全局关键字
use Northwind
GO



DECLARE EMP_CURSOR CURSOR 
FOR SELECT TOP 1 EmployeeID, LastName FROM EMPLOYEES WHERE  HireDate = '1994-11-15'
FOR UPDATE OF LastName

OPEN EMP_CURSOR

FETCH NEXT FROM EMP_CURSOR 

UPDATE EMPLOYEES
SET LastName = LastName + CAST(DatePart(ms,GetDate()) as char(3))
WHERE CURRENT OF EMP_CURSOR


CLOSE EMP_CURSOR

DEALLOCATE  EMP_CURSOR