使用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
相关产品推荐
相关产品推荐

