如果字符串包含表格中列的确切字符串,我试图用特定文本替换表格中的部分字符串。
我已经创建了一个列表,其中只包含我想要修改为变量表的字符串,然后使用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
答案 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而不是类似。