2016-02-25 68 views
0

我有一個需要從不同數據庫中提取的臨時表。原因是每個DB都在一個單獨的員工組中持有信息,我們正試圖創建一個報告,將他們全部歸入一個文件。要做到這一點,當我創建臨時表我說:TSQL如何多次更新臨時表列

Select ... 
     ,... 
     ,CAST(NULL AS int) AS 'FedExemptions' 
     ,... 
INTO #TaxInfo 
FROM #.... 

然後我更新FedExemptions柱像這樣:

UPDATE #TaxInfo 
set FedExemptions = (SELECT ISNULL(FEDERAL_EXEMPTIONS, 0) 
       FROM <db1>.EMPS 
       WHERE CONVERT(int, <db1>.EMPS.EMP) = #TaxInfo.EmpNo) 
UPDATE #TaxInfo 
set FedExemptions = (SELECT ISNULL(FEDERAL_EXEMPTIONS, 0) 
       FROM <db2>.EMPS 
       WHERE CONVERT(int, <db2>.EMPS.EMP) = #TaxInfo.EmpNo) 
UPDATE #TaxInfo 
set FedExemptions = (SELECT ISNULL(FEDERAL_EXEMPTIONS, 0) 
       FROM <db3>.EMPS 
       WHERE CONVERT(int, <db3>.EMPS.EMP) = #TaxInfo.EmpNo) 
UPDATE #TaxInfo 
set FedExemptions = (SELECT ISNULL(FEDERAL_EXEMPTIONS, 0) 
       FROM <db4>.EMPS 
       WHERE CONVERT(int, <db4>.EMPS.EMP) = #TaxInfo.EmpNo) 

然而,最後更新(DB4)將覆蓋以往其他3更新,將前三組的Fedexemptions設置爲0

我不明白爲什麼。我可以發誓:

WHERE CONVERT(int, <db4>.EMPS.EMP) = #TaxInfo.EmpNo 

會使它,所以當emp數不匹配時SSMS不會觸及行。

作爲一個附註,我正在對Emp編號進行CONVERT處理,因爲#TaxInfo Emp編號是INTs,並且< db>數據庫是varchars。

回答

3

讓我重新格式化查詢:

UPDATE #TaxInfo 
SET FedExemptions = (
    SELECT ISNULL(FEDERAL_EXEMPTIONS, 0) 
    FROM <db4>.EMPS 
    WHERE CONVERT(int, <db4>.EMPS.EMP) = #TaxInfo.EmpNo 
) 

所以,現在你可以看到有關於查詢沒有WHERE條款。對於每一行,該值都將設置爲從內部查詢返回的內容。

我想你想要做的事更是這樣的:

UPDATE t SET FedExemptions = ISNULL(e.FEDERAL_EXEMPTIONS, 0) 
FROM #TaxInfo t 
JOIN <db4>.EMPS e ON CONVERT(int, e.EMPS.EMP) = t.EmpNo  
+0

Ohhhh,讓我看看是否有效:) –

+0

謝謝你。似乎我需要一個橡皮鴨,因爲那個看起來挺直直的,我的大腦只是拒絕想到...... –

2

好了,所以很多事情會在這裏沒有任何意義。

首先,相關的子查詢是進行更新的可怕方法。如果您仍然進行更新,那麼請使用連接,但在任何情況下對我來說實際上都沒有意義。

接下來,從您的代碼看來,您希望將值爲null的任何記錄更新爲0並獲取EMPS表中的值,爲什麼不將它們最初插入到臨時表中?例如:

INsert into #TaxInfo (put fields here) 
Select ... 
      ,... 
      ,ISNULL(FEDERAL_EXEMPTIONS, 0) AS 'FedExemptions' 
      ,... 

    FROM #.... 

根據實際的初始查詢,您可能需要向EMPS表中添加連接。在臨時表格和插入中專門定義列也是最佳做法。如果有人更改數據庫的結構會發生什麼?

此外,由於您從不同數據庫中的多個表獲取empnos,您確定它們不會重複嗎? empno 200可以是數據庫A中的一個人,還是數據庫b中的其他人?你真的需要檢查這種事情。

您也可以考慮創建一個視圖,它是所有這些表的聯合,然後查詢視圖是否值得。如果還有其他查詢也需要擊中所有這些表,這是最好的。如果您有機會添加另一個數據庫與另一個需要添加到所有這些查詢的EMPS表,那麼刪除並重新創建視圖要比查找引用這些表的1000個不同查詢更簡單。