Erw*_*ers 3 performance sql-server t-sql regex query-performance
我有一个临时表#NAMEOLD_NAMENEW,其中包含一列NAMEOLD和一列NAMENEW,其中每一行都包含要更新的值的旧值和新值。该表由大约 2.000 行组成。我在 上创建了一个聚集索引NAMEOLD。
临时表将用于更新数据库中的某些字段。我知道哪些表中的哪些列需要更新(大约 25 列超过 20 个表)。
现在,需要更新的字段包含字符串DOMAIN\作为前缀,然后是NAMEOLD临时表的值。
我想要做的是:使用临时表将字符串的完整值DOMAIN\加上之后的字符串替换为表中的适当值#NAMEOLD_NAMENEW。
例子:
示例数据#NAMEOLD_NAMENEW:
NAME_OLD NAMENEW
user1 user5
user2 user6
示例数据TABLE1:
ColumnWithName1
域\用户 1
域\用户 2
现在运行查询应该更新TABLE1为:
ColumnWithName1
USER5
user6
我认为多次扫描整个表不会表现得足够好(SELECT在某些表上已经需要几分钟)。
我想到的是输入所有需要更新的列,然后使用带有捕获组的正则表达式更新它们。像这样(非工作代码):
UPDATE [dbo].[Table1]
SET [ColumnWithName1] = (SELECT [NAMENEW] from new_old WHERE [NAMEOLD] = [/1]) -- first CAPTUREGROUP??
FROM #NAMEOLD_NAMENEW new_old
WHERE [ColumnWithName1] like '%DOMAIN\(.*)'
Run Code Online (Sandbox Code Playgroud)
此处捕获组不起作用,因为它似乎不存在于 T-SQL 中。此外,SELECT由于某种原因,我认为使用嵌套是一种不好的做法。
是否可以在 T-sql 中做这样的事情?或者有没有更好的方法?
通常模式是这样的:
UPDATE t
SET t.ColumnWithName1 = 'DOMAIN\\' + new_old.NAMENEW
FROM dbo.Table1 AS t
INNER JOIN #NAMEOLD_NAMENEW AS new_old
ON t.ColumnWithName1 = new_old.NAMEOLD
WHERE <some filter on a pattern>;
Run Code Online (Sandbox Code Playgroud)
但是您的问题并没有真正解释如何识别匹配的特定列。是[/1]真正的字符串值、模式还是其他东西?被\(.*)认为是一个正则表达式(这并不在本机T-SQL存在)?该User列是拼写错误还是您有多个具有此域前缀的列?
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |