我有这样的查询:
SELECT TOP 1 ID, DATA, OTHERINF FROM MYTABLE WHERE DATE = @DATE
并且在读取行数据并使用它之后,我想更新检索到的行并更改其中一个列(在另一个事务中)。
但正如你在这里看到的那样,我两次搜索那一行。有没有什么方法可以记住行并进行更新而无需再次搜索。
谢谢。
答案 0 :(得分:4)
在第一个查询中,您检索了ID。在第二个查询中使用它来查找要更新的行而不是使用日期:
UPDATE MYTABLE
SET DATA = 'FooBar'
WHERE ID = 200
答案 1 :(得分:0)
--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.
这应该这样做
答案 2 :(得分:0)
您可以将UPDATE与SELECT组合到一个语句中,但不能跨两个事务组合。因此,如果您需要更新另一个事务中的值而不是您选择它(原因我不清楚),您需要两个语句。
答案 3 :(得分:0)
我认为DATE列没有编入索引(如果不是,为什么不?)那么,最好的办法是确保检索主键(不是那个ID?)然后用它作为你的更新中的条件。
答案 4 :(得分:0)
我知道它不流行,但你也可以对游标进行定位更新 e.g。
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