Sql-Server

將導出的行標記為已導出

  • October 30, 2018

我需要編寫一個導出模組,將導出的行標記為已導出。我們目前執行 SQL Server Express 2012,但可能會切換到 O​​racle,所以我需要一種客戶端方法。我們目前使用的是 ASP.NET 4.5。

我有一個名為“exported”的布爾欄位,它應該設置為 true。

我的想法是在客戶端軟體的一個數組中收集所有受影響的行 ID 並建構類似的東西

元程式碼:

FOREACH(affectedRowsIDs as affectedRowID)
 $sql = "udpate myRows SET exported = 1 where id = $affectedRowID)
 execute $sql

問題是要執行很多查詢。

不一樣的想法:

FOREACH(affectedRowsIDs as affectedRowID)
 $affRows += " , $affectedRowID"

$sql = "udpate myRows SET exported = 1 where id IN ($affRows)"

你能給我一些回饋,你會怎麼做?

最佳解決方案可能取決於您的數據庫伺服器。在 PostgreSQL 中,最好的方法是這樣的:

BEGIN; -- start transaction
UPDATE myrows SET exported = true WHERE exported = false
RETURNING *;
-- do some work in the app to process these rows
COMMIT; -- if successful, else ROLLBACK;

如果這不可能,則創建一個臨時表,將要導出的資訊放在那裡,根據臨時表中的記錄更新導出的資訊,然後在事務完成後送出。記得清理你的臨時表。

這取決於您的情況,例如,如果您要獲取表的所有記錄,那麼您可以使用以下查詢直接標記導出的

UDPATE myRows SET exported = 1 WHERE exported != 1

如果您基於同一張表上的某些條件進行導出,那麼您可以將條件放在上面的 where 子句中

UDPATE myRows SET exported = 1 WHERE {Conditios}

如果您在相同的儲存過程中獲取 id,那麼您可以將所有這些 id 放在臨時表中,並且可以像下面這樣放置 join 或存在語句

UPDATE myrows
SET exported=1
WHERE EXISTS(SELECT id FROM myrows innter WHERE inner.id=myrows.id)

如果您從客戶端或 c# 程式碼獲取所有導出的 id,那麼您可以在儲存過程參數中傳遞這個逗號分隔的字元串,然後可以拆分它並可以像下面的查詢一樣更新

UPDATE myrows
SET exported=1
WHERE exists(SELECT id FROM splitfunction(@exportedIds) temp WHERE temp.id=myrows.id)

如果您有任何其他情況,請在評論中解釋,我將分享相同的查詢。

引用自:https://dba.stackexchange.com/questions/25196