SQL Server 2017中替换特定格式临时表名的技术问询
SQL Server 2017 批量清理临时表名的数字后缀
自定义函数实现全局替换
针对你的需求,我们可以创建一个自定义标量函数,遍历字符串中的所有目标临时表名,移除下划线后的数字部分:
CREATE OR ALTER FUNCTION dbo.CleanTempTableName(@InputString NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN -- 匹配 dbo.tmp[数字]_数字 格式的模式 DECLARE @Pattern NVARCHAR(50) = N'%dbo.tmp[0-9]_%[0-9]%' DECLARE @MatchStart INT = PATINDEX(@Pattern, @InputString) -- 循环处理所有匹配项 WHILE @MatchStart > 0 BEGIN -- 定位下划线的位置 DECLARE @UnderscorePos INT = CHARINDEX(N'_', @InputString, @MatchStart) -- 找到下划线后第一个非数字的位置(若到字符串结尾则取长度) DECLARE @NonDigitPos INT = PATINDEX(N'%[^0-9]%', SUBSTRING(@InputString, @UnderscorePos + 1, LEN(@InputString))) IF @NonDigitPos = 0 SET @NonDigitPos = LEN(@InputString) - @UnderscorePos + 1 -- 移除下划线后的数字部分 SET @InputString = STUFF(@InputString, @UnderscorePos, @NonDigitPos - 1, N'') -- 查找下一个匹配项 SET @MatchStart = PATINDEX(@Pattern, @InputString) END RETURN @InputString END
使用示例
假设你的审计日志存储在AuditLogs表的SQLText字段中,执行以下语句即可批量更新:
UPDATE AuditLogs SET SQLText = dbo.CleanTempTableName(SQLText) WHERE SQLText LIKE N'%dbo.tmp[0-9]_%[0-9]%'
效果验证
原始输入:
SELECT * FROM dbo.tmp1234_12345678 WHERE
SELECT * FROM dbo.tmp5678_56789012 WHERE
处理后输出:
SELECT * FROM dbo.tmp1234 WHERE
SELECT * FROM dbo.tmp5678 WHERE
注意事项
- 函数会处理字符串中所有符合格式的临时表名,兼容前后为空格或换行的场景
- 仅适用于SQL Server 2017及以上版本(依赖
CREATE OR ALTER语法) - 若临时表前缀不是
dbo.tmp,可修改函数中的@Pattern变量适配你的格式
内容的提问来源于stack exchange,提问作者TheNewNo2
相关产品推荐
相关产品推荐

