2016-02-25 59 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个不同查询更简单。