我有一个临时表#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 DISTINCT
mt.ID AS ID
FROM
[dbo].[MyTable] mt
WITH (NOLOCK)
WHERE
(@aVariable IS NULL
OR (CONVERT(VARCHAR(22), mt.Date1, 112) >= CONVERT(VARCHAR(22), @date1, 112))
AND (@status IS NULL
OR @status <> 2
OR ( @status = 2
AND ( SELECT COUNT(*)
FROM
MyTable mt2
WITH (NOLOCK)
WHERE
mt2.CaseID = mt.CaseID
AND mt2.Date1 > mt.Date1
) = 0
)
)
AND (@aSecondVariable IS NULL
OR (CONVERT(VARCHAR(22), mt.Date1, 112) <= CONVERT(VARCHAR(22), @date1, 112)))
AND (@aThirdVariable IS NULL
OR (CONVERT(VARCHAR(22), mt.Date2, 112) >= …Run Code Online (Sandbox Code Playgroud) 在 .NET WebForms 项目中,我们希望在数据库中记录一年中的某些操作。估计日志的最大大小为 1GB(每天 20.000 条记录,包含 10 个字段),每天最多可能被查询 2 次。
我们正在讨论是否建议将日志记录表放在一个新数据库中(甚至可能在一个单独的服务器上),或者在我们现有的数据库中使用一个新表。
使用我们现有的数据库的好处是我们不需要在代码中建立新的连接,也不需要管理一个新的数据库。缺点可能是数据库无法处理它。
你有什么见解?你有什么建议吗?