【问题标题】:SQL Server: Remove substrings from field data by iterating through a table of city namesSQL Server:通过遍历城市名称表从字段数据中删除子字符串
【发布时间】:2026-02-11 19:40:01
【问题描述】:

我有两个数据库,数据库 A 和数据库 B。

数据库 A 包含一些需要放在数据库 B 中的表中的数据。但是,在此之前,必须通过以下方式“清理”其中一些数据:

包含要放入数据库 B 中的数据的数据库 A 中的表有一个名为“Desc”的字段。系统的用户不时将城市名称与他们输入的数据一起输入“Desc”字段。例如:用户可以输入“将家具移至新隔间。纽约。加电。”

在将数据导入数据库 B 之前,需要从该数据中删除“纽约”一词,使其仅显示“将家具移至新隔间。加电。”但是——这很重要——数据库 A 中的原始数据必须保持不变。换言之,数据库 A 的数据仍将显示“将家具移至新隔间。纽约。添加电”,而数据库 B 中的数据将显示“将家具移至新隔间。加电。”

数据库 B 包含一个表,其中包含城市名称列表,这些城市名称需要从数据库 A 的“Desc”字段数据中删除,然后才能放入数据库 B。

如何构造一个存储过程或函数,它将从数据库 A 中获取数据,然后遍历数据库 B 中的 Cities 表,如果在“Desc”字段中找到城市名称,则将其删除,同时保留其余部分该字段中的信息,从而创建一个记录集,然后我可以使用它来填充数据库 B 中的相应表?

我已经尝试了几件事,但仍然没有破解它。然而,我确信这可能相当容易。非常感谢任何帮助!

谢谢。

编辑:

我尝试解决此问题的最新方法是:

DECLARE @cityName VarChar(50)

While (Select COUNT(*) From ABCScanSQL.dbo.tblDiscardCitiesList) > 0

Begin

Select @cityName = ABCScanSQL.dbo.tblDiscardCitiesList.CityName FROM ABCScanSQL.dbo.tblDiscardCitiesList

SELECT JOB_NO, LTRIM(RTRIM(SUBSTRING(JOB_NO, (LEN(job_no) -2), 5))) AS  LOCATION
      ,JOB_DESC, [Date_End] , REPLACE(Job_Desc,@cityName,' ') AS NoCity
       FROM fmcs_tables.dbo.Jobt WHERE Job_No like '%loc%'
End

“Job_Desc”是需要删除城市名称的字段。

【问题讨论】:

  • 你不想在你的帖子中添加这些几件事
  • 你有这些要替换的项目(城市名称)的列表吗?它存储在表中吗?

标签: sql sql-server database iteration


【解决方案1】:

这是一个数据质量问题。您可以随时复制数据库 A 中的 [description] 并将其命名为 [cleaned_desc]。

一个简单的解决方案是编写一个执行以下操作的函数。

1 - 从 [tbl_remove_these_words] 读取数据。这些是您要删除的短语。

2 - 将输入 - @var_description 与表中的行进行比较。

3 - 匹配时,替换为空字符串。

此解决方案取决于您维护和更新的清理表。

运行更新查询,使用来自 [description] 的输入并调用 [fn_remove_these_words] 并将 [cleaned_desc] 设置为输出。

另一种解决方案是查看用于 SSIS 的 Melisa Data (DQ) 产品或 SQL 服务器堆栈中的数据质量服务等产品,为您提供解决问题的应用程序框架。

【讨论】: