2014-03-05 94 views
-1

我正在寫一個自動任務的更新,用於同步來自不同應用程序的同一個數據庫中兩個不同表的數據。腳本的原始版本是用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腳本以獲得更高效的額外輸入將不勝感激,但不會自行獲得答案獎勵。

+0

這會是一個事務處理 - 問題:

您可以使用單個查詢做到這一點?我在腳本中沒有看到任何'commit'語句... –

+0

@ piet.t這裏需要嗎?這不會在事務標記中被阻止,它只是一個腳本塊。 –

回答

1

這是有點難但沒有模式,但我認爲你正在做的是更新表A有ESN和parentID從表B,其中a.IMSI = b.termPhone和parentid表a是空的或空。

update table_a 
set esn = b.esn, 
    parentid = b.termphone 
from table_a a, 
    table_b b 
where a.imsi = b.termphone 
and (a.parentid is null 
    or a.parentid = '') 
+0

隱式超顯式連接的任何原因? –

+0

不是真的 - 我傾向於喜歡他們,但這是個人喜好的事情 –

相關問題