替换包含表

时间:2018-05-02 14:14:48

标签: sql sql-server tsql replace

如果字符串包含表格中列的确切字符串,我试图用特定文本替换表格中的部分字符串。

我已经创建了一个列表,其中只包含我想要修改为变量表的字符串,然后使用CROSS JOIN连接到目标表,但是这两个表中的数据量意味着交叉连接可以最终会出现数亿行,而我想要交换数据的绝大多数字符串可能不包含第二个表中的任何数据。

还没有任何方法可以识别表1中的哪些记录会被修改,因为我想要修改的字符串中没有标识符。我已经在下面:

DECLARE @Table2 TABLE (T2.Column1 Varchar(100), T2.Column2 INT)


INSERT INTO @Table2
Select
    T3.Column2 + ', ' + T3.Column3,
    T3.Column1
FROM Table3 T3
    WHERE T3.Column1 IN (1,2,3,4)

UPDATE Table1 SET Column1 = REPLACE(T1.Column1, T2.Column1, 'String')
        FROM Table1 T1
        CROSS JOIN @Table2 T2

我也尝试使用CROSS APPLY而不是CROSS JOIN来做同样的事情,但性能保持不变。

这确实有效,但由于必须连接两个表中的每一行,因此性能很差。是否有任何方法可以实现相同的结果,但没有连接每一行进行比较?

修改

示例数据:

CREATE TABLE Table1 ([Column1] varchar(4000), [Column2] INT)
CREATE TABLE Table3 ([Column1] INT, [Column2] Varchar(50), [Column3] Varchar(50))

INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 1: text, example', 1)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 2 example text', 2)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 3', 3)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To, Replace 4 extra text', 4)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To, Replace 5', 5)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example Data To Replace 6', 6)
INSERT [dbo].[Table1] ([Column1], [Column2]) VALUES ('Example, Data To Replace 7', 7)

INSERT [dbo].[Table3] ([Column1], [Column2], [Column3]) VALUES (1, 'text', 'example')
INSERT [dbo].[Table3] ([Column1], [Column2], [Column3]) VALUES (2, 'To', 'Replace')
INSERT [dbo].[Table3] ([Column1], [Column2], [Column3]) VALUES (3, 'Example', 'Data')

我原以为它会返回以下内容,但它实际上只修正了table1中的第一行:

Column1                                     Column2
Example Data To Replace 1: String           1
Example Data To Replace 2 example text      2
Example Data To Replace 3                   3
Example Data String 4 extra text            4
Example Data String 5                       5
Example Data To Replace 6                   6
String To Replace 7                         7

1 个答案:

答案 0 :(得分:1)

我不明白为什么在使用内连接时使用交叉连接:

UPDATE T1 
SET T1.Column1 = REPLACE(T1.Column1, T2.Column1, 'String')
FROM Table1 As T1 
JOIN Table2 As T2 ON T1.Column1 LIKE '%'+ T2.Column1 +'%'

这只会更新实际需要更新的记录,并且应该比交叉连接具有更好的性能。如果它仍然存在性能问题,您可能希望使用full text search而不是类似。

You can see a live demo on rextester.