Sql-Server
將導出的行標記為已導出
我需要編寫一個導出模組,將導出的行標記為已導出。我們目前執行 SQL Server Express 2012,但可能會切換到 Oracle,所以我需要一種客戶端方法。我們目前使用的是 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)
如果您有任何其他情況,請在評論中解釋,我將分享相同的查詢。