TSQL如何多次更新临时表列

TSQL如何多次更新临时表列,sql,sql-server,tsql,sql-update,temp-tables,Sql,Sql Server,Tsql,Sql Update,Temp Tables,我有一个临时表,需要从不同的数据库中提取。原因是每个数据库都将信息保存在一个单独的员工组中,我们正在尝试创建一个报告,将所有员工都拉入一个文件中。为此,当我创建临时表时,我会说: Select ... ,... ,CAST(NULL AS int) AS 'FedExemptions' ,... INTO #TaxInfo FROM #.... 然后我更新FedExemptions列,如下所示: UPDATE #TaxInfo set FedExemp

我有一个临时表,需要从不同的数据库中提取。原因是每个数据库都将信息保存在一个单独的员工组中,我们正在尝试创建一个报告,将所有员工都拉入一个文件中。为此,当我创建临时表时,我会说:

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编号不匹配时,SSM就不会触及行


作为旁注,我正在对Emp编号进行转换,因为其中一个TaxInfo Emp编号是INTs,数据库是varchars。

让我重新格式化该查询:

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

让我重新格式化该查询:

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

好吧,这里发生了很多没有意义的事情

首先,相关子查询是执行更新的糟糕方式。如果你仍然在做一个在任何情况下对我来说都没有意义的更新,请使用连接

接下来,我从代码中看到,您希望将任何值为null的记录更新为0,并获取EMPS表中的值,那么为什么不在临时表的insert中原始获取这些值呢?比如:

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

    FROM #....
您可能需要根据实际的初始查询向EMPS表添加联接。在temp表和insert中专门定义列也是最佳做法。如果有人更改了数据库的结构,会发生什么情况

另外,由于您从不同数据库中的多个表中获取EMPNO,您确定它们不会重复吗?empno 200是否可以是数据库A中的一个人和数据库b中的另一个人?你真的需要检查一下这类事情


您也可以考虑是否创建一个视图,这些视图是所有这些表的联合,然后查询视图。如果还有其他查询也需要访问所有这些表,那么这是最好的选择。如果您有机会添加另一个数据库以及需要添加到所有这些查询中的另一个EMPS表,那么删除并重新创建视图比查找引用这些表的1000个不同查询要简单得多。

好吧,这里发生了很多没有意义的事情

首先,相关子查询是执行更新的糟糕方式。如果你仍然在做一个在任何情况下对我来说都没有意义的更新,请使用连接

接下来,我从代码中看到,您希望将任何值为null的记录更新为0,并获取EMPS表中的值,那么为什么不在临时表的insert中原始获取这些值呢?比如:

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

    FROM #....
您可能需要根据实际的初始查询向EMPS表添加联接。在temp表和insert中专门定义列也是最佳做法。如果有人更改了数据库的结构,会发生什么情况

另外,由于您从不同数据库中的多个表中获取EMPNO,您确定它们不会重复吗?empno 200是否可以是数据库A中的一个人和数据库b中的另一个人?你真的需要检查一下这类事情


您也可以考虑是否创建一个视图,这些视图是所有这些表的联合,然后查询视图。如果还有其他查询也需要访问所有这些表,那么这是最好的选择。如果您有机会添加另一个数据库以及需要添加到所有这些查询中的另一个EMPS表,则删除并重新创建视图比查找引用这些表的1000个不同查询更简单。

谢谢您。似乎我需要一只橡皮鸭子在周围,因为它看起来足够直截了当,我的大脑拒绝去想那个…谢谢你们。似乎我需要一只橡皮鸭,因为它看起来足够直,我的大脑只是拒绝去想那个。。。