TSQL 如何多次更新 Temp Table 列
TSQL How do I update a Temp Table column multiple times
我有一个临时 table 需要从不同的数据库中提取。原因是每个数据库都在一组单独的员工中保存信息,而我们正在尝试创建一个将它们全部拉入一个文件的报告。为此,当我创建临时 table 我说:
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 编号进行转换,因为其中一个 #TaxInfo Emp 编号是 INT,而 数据库是 varchars。
让我重新格式化该查询:
UPDATE #TaxInfo
SET FedExemptions = (
SELECT ISNULL(FEDERAL_EXEMPTIONS, 0)
FROM <db4>.EMPS
WHERE CONVERT(int, <db4>.EMPS.EMP) = #TaxInfo.EmpNo
)
所以现在您可以看到 outer 查询中没有 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
好吧,这里发生了很多没有意义的事情。
首先,相关子查询是一种糟糕的更新方式。如果您仍然执行实际上对我来说无论如何都没有意义的更新,请改用联接。
接下来我从你的代码中看出你想要将值为 null 的任何记录更新为 0 并获取 EMPS table 中的值,所以为什么不在插入中获取它们最初温度 table?类似于:
INsert into #TaxInfo ( put fields here)
Select ...
,...
,ISNULL(FEDERAL_EXEMPTIONS, 0) AS 'FedExemptions'
,...
FROM #....
您可能需要向 EMPS 添加联接 table,具体取决于您的实际初始查询。在临时 table 和插入中专门定义列也是一种最佳做法。如果有人更改了您的数据库结构会怎样?
此外,由于您从不同数据库中的多个 table 获取 empnos,您确定它们没有重复吗? empno 200 可以是数据库 A 中的一个人和数据库 b 中的其他人吗?你真的需要检查一下这种东西。
您还可以考虑是否值得创建一个视图,该视图是所有这些 table 的联合,然后查询该视图。如果还有其他查询也需要命中所有这些 table,这是最好的事情。如果您有机会添加另一个数据库和另一个需要添加到所有这些查询的 EMPS table,那么删除并重新创建视图比查找引用这些 [=23= 的 1000 个不同查询更简单]s.
我有一个临时 table 需要从不同的数据库中提取。原因是每个数据库都在一组单独的员工中保存信息,而我们正在尝试创建一个将它们全部拉入一个文件的报告。为此,当我创建临时 table 我说:
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 编号进行转换,因为其中一个 #TaxInfo Emp 编号是 INT,而
让我重新格式化该查询:
UPDATE #TaxInfo
SET FedExemptions = (
SELECT ISNULL(FEDERAL_EXEMPTIONS, 0)
FROM <db4>.EMPS
WHERE CONVERT(int, <db4>.EMPS.EMP) = #TaxInfo.EmpNo
)
所以现在您可以看到 outer 查询中没有 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
好吧,这里发生了很多没有意义的事情。
首先,相关子查询是一种糟糕的更新方式。如果您仍然执行实际上对我来说无论如何都没有意义的更新,请改用联接。
接下来我从你的代码中看出你想要将值为 null 的任何记录更新为 0 并获取 EMPS table 中的值,所以为什么不在插入中获取它们最初温度 table?类似于:
INsert into #TaxInfo ( put fields here)
Select ...
,...
,ISNULL(FEDERAL_EXEMPTIONS, 0) AS 'FedExemptions'
,...
FROM #....
您可能需要向 EMPS 添加联接 table,具体取决于您的实际初始查询。在临时 table 和插入中专门定义列也是一种最佳做法。如果有人更改了您的数据库结构会怎样?
此外,由于您从不同数据库中的多个 table 获取 empnos,您确定它们没有重复吗? empno 200 可以是数据库 A 中的一个人和数据库 b 中的其他人吗?你真的需要检查一下这种东西。
您还可以考虑是否值得创建一个视图,该视图是所有这些 table 的联合,然后查询该视图。如果还有其他查询也需要命中所有这些 table,这是最好的事情。如果您有机会添加另一个数据库和另一个需要添加到所有这些查询的 EMPS table,那么删除并重新创建视图比查找引用这些 [=23= 的 1000 个不同查询更简单]s.