【问题标题】:Search and replace entire column value SQL Server搜索和替换整个列值 SQL Server
【发布时间】:2016-03-09 19:39:27
【问题描述】:

我第一次来 Stack Overflow。我需要帮助创建一个搜索特定字符串并将数据库中该列的整个值替换为另一个字符串的过程。例如,这是我需要搜索并替换为的数据:

search column:         replace column:
1.'rbc inv',           1.'RBC dominion securities',
2.'rbc dom',           2.'RBC dominion securities',
3.'RBC'                3.'RBC Bank'

我收到了 Excel 格式的上述内容,并将其作为表格上传到 SQL Server,然后运行我的脚本,如下所示。有列当前有字符串 RBC Investments for Seniors 需要替换为 RBC dominion 证券(上面的第 1 号)。

我的问题是,当搜索列彼此非常相似时,replace 函数不起作用,正如您在上面看到的那样,它只替换找到的字符串,而不是数据库中的整个单元格或列值。我尝试在将列值替换为新值之前将其设置为 null 并多次失败。我有一种方法可以一次手动执行此操作,但是当我收到一个包含 300 多列的 Excel 表时,我需要查找和替换,这非常令人沮丧。任何人都可以帮忙吗?谢谢,麻烦您了。

这是我创建的脚本。

SET NOCOUNT ON;

DECLARE @searchColumnValue nvarchar(max), @replaceColumnValue nvarchar(max)

DECLARE replace_cursor CURSOR FOR 
SELECT searchColumn, replaceColumn             -
FROM dbo.search

OPEN replace_cursor

FETCH NEXT FROM replace_cursor
INTO @searchColumnValue , @replaceColumnValue 
WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE contact3                          
    SET notes = REPLACE(notes, @searchColumnValue, @replaceColumnValue)  

    FETCH NEXT FROM replace_cursor
    INTO @searchColumnValue , @replaceColumnValue
END 
CLOSE replace_cursor
DEALLOCATE replace_cursor

【问题讨论】:

  • 为什么要使用光标
  • 搜索字符串是您需要在列数据中查找的一些文本吗?如果你找到它,你想用另一个搜索字符串替换那个搜索字符串还是用新字符串替换该列中的所有数据?
  • 您是说您希望您的 UPDATE 替换 rbc inv 但不替换 rbc investments?这是唯一的问题吗?
  • @Karmran:我正在使用光标在我上传的 Excel 表之间进行迭代,并循环遍历每个搜索列。我希望用新字符串替换整个列和所有列。
  • @Tab Alleman:我希望我的搜索能够查找其中可能包含“RBC inv”的任何句子。例如,“RbC Investment for Seniors 65+”和“RBC inv for Juniors”都需要替换为“RBC dominion Securities”

标签: sql sql-server sql-server-2008


【解决方案1】:

我希望我理解正确。所以我会重复一遍。

  1. 您有 1 个包含大量条目的表
  2. 您从 excel 中获得此列表,您可以在其中搜索“搜索列”
  3. 如果匹配,将整个值替换为“替换列”

如果是这种情况,那么这可能是解决方案:

declare @data table (Column1 nvarchar(50))

insert  into @data
        (Column1)
values  (N'RbC investment for Seniors 65+'),
        (N'RBC inv for juniors')

declare @replace table
    (
     OriginalValue nvarchar(50),
     NewValue nvarchar(50),
     [priority] int
    )

insert  into @replace
        (OriginalValue, NewValue, [priority])
values  (N'rbc inv', N'RBC dominion securities', 2),
        (N'rbc dom', N'RBC dominion securities', 2),
        (N'RBC', N'RBC Bank', 3)

update  @data
set     Column1 = coalesce((
                            select top 1
                                    NewValue
                            from    @replace
                            where   Column1 like '%' + OriginalValue + '%'
                            order by [priority]
                           ), Column1)

select  *
from    @data

表“数据”将是您进行替换的表。

使用它可能会产生相当多的副作用(例如“search_column”中的 % 等通配符,可能有多个匹配项 - 现在采用“随机”匹配项,性能可能不是最好的,...) 但我想要获得更准确的答案,我需要一个更好的问题。

编辑:

感谢 Ralph... 我在“替换”表中添加了一个优先级,以便能够处理重复的匹配项。

如果“RBC”的优先级为 3,则结果为:

优先级为 1:

【讨论】:

  • 您可能想要扩展您的解决方案并提及替换表中排序顺序的重要性。如果replace N'RBC' for N'RBC Bank' 在替换表中更靠前,那么它会首先被(错误地)替换。
  • 嗨拉尔夫,感谢更新查询。能够立即对其进行测试当然要好得多:-)
  • 感谢 Philipp 和 Ralph。你们真的救了我的命。谢幕。交给你。
猜你喜欢
  • 2012-04-22
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多