You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:20:23