我創建了以下查詢來創建觸發器來更新lastUpdatedTime. 我需要使用下面的觸發器更新底部的兩行。
但是當我使用
ORDER BY p.id DESC;
我收到一個錯誤:
關鍵字“order”附近的語法不正確
CREATE TRIGGER trgAfterUpdate12
ON [spider3].[ProductClassModulePeriod]
FOR INSERT, UPDATE
AS
UPDATE TOP(2) p
SET [lastUpdatedTime] = GETDATE()
FROM [spider3].[ProductClassModulePeriod] AS p
INNER JOIN inserted AS i ON p.id = i.id;
嘗試使用WITH但出現以下錯誤
CREATE TRIGGER trgAfterUpdate122
ON [spider3].[ProductClassModulePeriod]
FOR INSERT, UPDATE
AS
WITH q AS
(
SELECT *
FROM [spider3].[ProductClassModulePeriod] AS p
INNER JOIN inserted AS i ON p.id = i.id
ORDER BY p.primaryKey DESC
)
UPDATE q
SET [lastUpdatedTime] = GETDATE();
錯誤:
ORDER BY 子句在視圖、行內函式、派生表、子查詢和公用表運算式中無效,除非還指定了 TOP、OFFSET 或 FOR XML。
如何更新底部的 2 行?
uj5u.com熱心網友回復:
您可以使用此答案并實作它以在使用 p.id 按降序排序后更新前 2 行。
此外,您是否要更新僅插入的值?
如果從整個表更新,那么您可以使用它。
ALTER TRIGGER trgAfterUpdate12 ON [spider3].[ProductClassModulePeriod]
FOR INSERT, UPDATE
AS
WITH cte AS
(
SELECT TOP 2 *
FROM [spider3].[ProductClassModulePeriod] p
ORDER BY p.id DESC
)
UPDATE cte
SET [lastUpdatedTime] = GETDATE()
uj5u.com熱心網友回復:
我有一個問題:為什么在觸發器作業時要更新兩行,我認為“插入”的臨時表中的行數是未知的。試試看是否效果良好:
UPDATE p
SET [lastUpdatedTime] = GETDATE()
FROM [spider3].[ProductClassModulePeriod] AS p
INNER JOIN inserted AS i ON p.id = i.id;
uj5u.com熱心網友回復:
ALTER TRIGGER trgAfterUpdate ON [spider3].[ProductClassModulePeriod]
FOR INSERT, UPDATE
AS
WITH t AS
(
select TOP 1 p.id, p.lastUpdatedTime, p.primaryKey FROM [spider3].[ProductClassModulePeriod] AS p
INNER JOIN inserted AS i
ON p.id = i.id
order by p.primaryKey desc
)
UPDATE t
SET [lastUpdatedTime] = GETDATE();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/397838.html
標籤:sql sql-server 查询语句
上一篇:使用SQLServer傳遞帶有資料表引數的表中的非資料表引數
下一篇:程式重復執行
