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

使用C#自动化格式化存储过程中dbo相关对象的需求

用C#实现SQL存储过程中dbo关联对象的自动化格式化

需求概述

我有多个存储过程需要按严格规范格式化:检测到dbo时,其关联的所有单词需添加方括号并转换为小写。

格式示例

原SQL代码:

1 SELECT  c.COLA,
2    c.COLB,
3    c.COLC
4 FROM database.dbo.table1 c
5 LEFT JOIN [Database].[dbo].[Table2] cs ON cs.sourceid = c.sourceid
6 LEFT JOIN dbo.FunctionName1('Status', 'N/A') AS vvc ON c.STATUS = vvc.STATUS
7 WHERE c.val <> 'Y'

格式化后代码:

1 SELECT  c.COLA,
2    c.COLB,
3    c.COLC
4 FROM [database].[dbo].[table1] c
5 LEFT JOIN [database].[dbo].[table2] cs ON cs.sourceid = c.sourceid
6 LEFT JOIN [dbo].[functionname1]('Status', 'N/A') AS vvc ON c.STATUS = vvc.STATUS
7 WHERE c.val <> 'Y'

具体规则

  • 对database.dbo.table1这类未加方括号的结构,为每个与dbo关联的单词添加方括号,保留前后SQL关键字(如FROM)和别名(如c)
  • 对已带方括号的[Database].[dbo].[Table2],将所有括号内的内容转换为小写
  • 对dbo.FunctionName1('Status', 'N/A')这类函数调用,为dbo添加方括号,函数名转小写并加方括号,不修改括号内的参数内容

C#实现方案

通过正则表达式结合字符串处理,针对不同场景编写替换逻辑,实现自动化格式化。

完整代码

using System;
using System.Text.RegularExpressions;

public class SqlDboFormatter
{
    public static string FormatDboElements(string sqlContent)
    {
        // 处理未加方括号的xxx.dbo.yyy结构
        string patternUnbracketed = @"(\b[a-zA-Z0-9_]+)\.dbo\.([a-zA-Z0-9_]+)\b";
        sqlContent = Regex.Replace(sqlContent, patternUnbracketed, match => 
            $"[{match.Groups[1].Value.ToLower()}].[dbo].[{match.Groups[2].Value.ToLower()}]");

        // 处理已加方括号的[XXX].[dbo].[YYY]结构,转小写
        string patternBracketed = @"\[([a-zA-Z0-9_]+)\]\.\[dbo\]\.\[([a-zA-Z0-9_]+)\]";
        sqlContent = Regex.Replace(sqlContent, patternBracketed, match => 
            $"[{match.Groups[1].Value.ToLower()}].[dbo].[{match.Groups[2].Value.ToLower()}]");

        // 处理dbo.FunctionName这类函数调用
        string patternFunction = @"\bdbo\.([a-zA-Z0-9_]+)(?=\()";
        sqlContent = Regex.Replace(sqlContent, patternFunction, match => 
            $"[dbo].[{match.Groups[1].Value.ToLower()}]");

        return sqlContent;
    }

    // 测试用例
    public static void Main()
    {
        string originalSql = @"1 SELECT  c.COLA,
2    c.COLB,
3    c.COLC
4 FROM database.dbo.table1 c
5 LEFT JOIN [Database].[dbo].[Table2] cs ON cs.sourceid = c.sourceid
6 LEFT JOIN dbo.FunctionName1('Status', 'N/A') AS vvc ON c.STATUS = vvc.STATUS
7 WHERE c.val <> 'Y'";

        string formattedSql = FormatDboElements(originalSql);
        Console.WriteLine(formattedSql);
    }
}

代码说明

  • 未加方括号结构处理:正则匹配xxx.dbo.yyy格式,捕获对象名后转小写并包裹方括号
  • 已加方括号结构处理:匹配带括号的[XXX].[dbo].[YYY],将括号内的对象名转为小写
  • 函数调用处理:匹配dbo.后跟函数名(到左括号为止),将dbo.FuncName替换为[dbo].[funcname],不影响参数内容
  • 所有替换操作仅针对dbo关联的对象,保留SQL语句其他部分不变

注意事项

  • 若存储过程包含嵌套函数、复杂子查询等结构,需根据实际情况调整正则表达式覆盖更多场景
  • 批量处理前建议先在测试环境验证格式化结果,确保符合规范要求

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:42:29