首页 > 解决方案 > 使用单个查找表更新多列

问题描述

我正在使用 Azure SQL 数据库使用 Power BI 创建报告。我需要创建一个越南语的报告,我已经为其复制了我的数据库,现在尝试将英语文本数据翻译成越南语。为此,我创建了一个查找表,其中包含英文文本以及两个不同列中的相应翻译。我的数据表可以有两个或多个包含英文文本的列,我应该在查找表中查找以获取越南语文本并将更新的英文数据替换为翻译后的数据。数据表(我可以有多个带有英文数据的表):

+-------------+-------------+-------------+----------------+-----------------+
|   id        | eng_col1    | eng_col2    | eng_col3       |  eng_col4       |
|             |             |             |                |                 |
+----------------------------------------------------------------------------+
|   1         |  hello      |             |      hello     |     yes         |
|             |             |    no       |                |                 |
+----------------------------------------------------------------------------+
|   2         |             |   no        |    hello       |                 |
|             |  world      |             |                |     no          |
+----------------------------------------------------------------------------+
|    3        |  yes        |    hello    ||      yes      |    world        |
+-------------+-------------+------------------------------+-----------------+

查找表(只有一个查找表,其中包含所有表中存在的所有英文文本):

+-------------+--------------
|   english   | vietnamese  |
|             |             |
+---------------------------+
|   yes       |  Đúng       |
|             |             |
+---------------------------+
|   no        |             |
|             |  Không      |
+---------------------------+
|    hello    |xin chào     |
+---------------------------+
| world       | thế giới    |
|             |             |
+-------------+-------------+

有没有办法一次性更新所有表?还是我需要分别为每个表编写更新查询?TIA

标签: sqlsql-serverdatabaseazurepowerbi

解决方案


在不知道您的完整数据模型的情况下,您可以尝试两件事

选项1

如果所有列都具有相同的名称,您可以编写 1 个查询并在所有表上执行它们sp_MsForEachTable

例子:

exec sp_MsForEachTable 'UPDATE x SET Column = lt.Vietnamese FROM ? x INNER JOIN lookupTable lt on lt.English = x.Column'

选项 2

您还可以基于sys.tables和生成 SQL 语句sys.columns。例子:


SELECT CONCAT('UPDATE x SET ', QUOTENAME(c.Name) , ' = lt.Vietnamese FROM ' , QUOTENAME(SCHEMA_NAME(t.Schema_Id)), '.', QUOTENAME(t.Name), ' x 
INNER JOIN lookupTable lt on lt.English = x.', QUOTENAME(c.Name))
FROM sys.Tables t
INNER JOIN sys.Columns c on c.Object_Id = t.Object_Id
-- Or use a different custom condition 
WHERE t.Name IN (/*Tables you want to update*/)
AND c.Name IN (/*Columns you want to update*/)

这个查询的输出,可以用来在多个表上执行多个语句。


推荐阅读