通过查找表更新包含特定前缀的字段

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 中做这样的事情?或者有没有更好的方法?

Aar*_*and 5

通常模式是这样的:

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列是拼写错误还是您有多个具有此域前缀的列?