我正在寫一個自動任務的更新,用於同步來自不同應用程序的同一個數據庫中兩個不同表的數據。腳本的原始版本是用ColdFusion編寫的,並且工作得很好,但我想在SQL中重寫一部分代碼以提高性能。原始代碼的腳本是在ColdFusion和看起來像這樣:此查詢不起作用。我究竟做錯了什麼?
<cfquery name="getIMSIToUpdate" datasource="mydsn">
SELECT DISTINCT a.imsi, b.esn, b.parentId
FROM table_a a
INNER JOIN table_b b ON a.imsi = b.termPhone
WHERE (a.parentID IS NULL OR a.parentID = '')
</cfquery>
<cfloop query="getIMSIToUpdate">
<cfquery name="updtIMSIParentIdEsn" datasource="mydsn">
UPDATE table_a
SET esn = <cfqueryparam cfsqltype="cf_sql_varchar" value="#Trim(getIMSIToUpdate.esn)#" null="#NOT Len(Trim(getIMSIToUpdate.esn))#" />
,parentId = <cfqueryparam cfsqltype="cf_sql_integer" value="#Trim(getIMSIToUpdate.parentId)#" null="#NOT Len(Trim(getIMSIToUpdate.parentId))#" />
WHERE imsi = <cfqueryparam cfsqltype="cf_sql_varchar" value="#Trim(getIMSIToUpdate.imsi)#" />
</cfquery>
所以我從表格中的查詢記錄,然後在每個記錄循環返回,並根據執行更新表A的值是什麼在原始查詢中從表B中檢索。這是SQL查詢我寫來替換此代碼:
BEGIN
DECLARE @update_table TABLE (imsi VARCHAR(25), esn VARCHAR(25), parentId INT);
DECLARE @localimsi VARCHAR(25);
DECLARE @localesn VARCHAR(25);
DECLARE @localparentid INT;
SELECT a.imsi, b.esn, b.parentId
INTO "dbo"."@update_table"
FROM dbo.table_a A
INNER JOIN table_b B ON A.imsi = B.termPhone
WHERE (A.parentID IS NULL OR A.parentID = '');
WHILE (SELECT COUNT(*) FROM @update_table) <> 0
SELECT TOP 1
@localimsi = imsi,
@localesn = esn,
@localparentid = parentid
FROM @update_table;
UPDATE table_a A
SET esn = @localesn,
parentId = @localparentid
WHERE imsi = @localimsi;
DELETE FROM @update_table WHERE imsi = @localimsi;
END
DROP TABLE "dbo"."@update_table";
我敢肯定有,我可以對我自己解決此一方式,但我不熟悉的SQL服務器調試器如何工作的,我不是100%確定實際發生的事情,只是我認爲應該發生的事情。查詢確實選擇了適當的行和值並將它們插入到臨時表中,但不會更新任何選定的記錄。有關如何編寫此SQL腳本以獲得更高效的額外輸入將不勝感激,但不會自行獲得答案獎勵。
這會是一個事務處理 - 問題:
您可以使用單個查詢做到這一點?我在腳本中沒有看到任何'commit'語句... –
@ piet.t這裏需要嗎?這不會在事務標記中被阻止,它只是一個腳本塊。 –