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

如何用C#将SQL SELECT语句批量转换为DELETE语句?

如何用C#批量将指定格式的SELECT语句转换为DELETE语句

问题描述

我有一批格式如下的SQL SELECT语句:

SELECT a.* 
FROM Table1 a 
JOIN Table2 cb ON a.LookupId = cb.CBLookupId 
JOIN Table3 m ON m.Id = cb.Id   

需要将它们转换为对应的DELETE语句,示例转换结果如下:

DELETE Table1 
FROM Table1 a 
JOIN Table2 cb ON a.LookupId = cb.CBLookupId 
JOIN Table3 m ON m.Id = cb.Id

共有约50条此类语句,每条的表别名各不相同,需要实现通用的转换逻辑,请问如何用C#完成这个任务?

解决方案

核心思路

针对你给出的固定格式SQL,我们可以通过正则匹配提取关键信息来完成转换:

  1. 抓取SELECT后的目标表别名(比如示例里的a)
  2. 找到FROM子句中该别名对应的原始表名(比如a对应的Table1)
  3. 把开头的SELECT [别名].*替换为DELETE [原始表名]
  4. 保留FROM及之后的所有SQL内容不变

C#代码实现

using System;
using System.Text.RegularExpressions;

public class SqlSelectToDeleteConverter
{
    public static string Convert(string selectSql)
    {
        // 正则规则:匹配固定格式的SELECT语句,捕获别名、表名和后续SQL内容
        var regexPattern = @"^\s*SELECT\s+(\w+)\.\*\s+FROM\s+(\w+)\s+\1\s*(.*)$";
        var matchResult = Regex.Match(selectSql, regexPattern, 
                                      RegexOptions.Singleline | RegexOptions.IgnoreCase);

        if (!matchResult.Success)
        {
            throw new ArgumentException("输入的SELECT语句格式不符合预期,请检查");
        }

        string targetAlias = matchResult.Groups[1].Value;
        string targetTableName = matchResult.Groups[2].Value;
        string restOfSql = matchResult.Groups[3].Value;

        // 拼接生成DELETE语句
        return $"DELETE {targetTableName}\nFROM {targetTableName} {targetAlias}{restOfSql}";
    }

    // 批量处理示例
    static void Main()
    {
        // 单条转换测试
        string sampleSelectSql = @"SELECT a.* 
FROM Table1 a 
JOIN Table2 cb ON a.LookupId = cb.CBLookupId 
JOIN Table3 m ON m.Id = cb.Id   ";

        string convertedDeleteSql = Convert(sampleSelectSql);
        Console.WriteLine(convertedDeleteSql);

        // 批量处理可遍历SQL列表/文件内容,逐个调用Convert方法
        // 例如:
        // var selectSqlList = new List<string> { ... };
        // var deleteSqlList = selectSqlList.Select(Convert).ToList();
    }
}

注意事项

  • 上述代码依赖正则匹配,仅适用于你描述的固定格式SELECT语句(即SELECT [别名].* FROM [表名] [别名] JOIN ...结构)
  • 如果你的SQL包含更复杂的逻辑(比如WHERE子句、子查询、括号嵌套等),建议使用专业的SQL解析库(如Microsoft.SqlServer.TransactSql.ScriptDom)来做更严谨的语法解析,避免正则匹配失效
  • 批量处理时,可以读取存储SQL的文本文件,逐行或按语句分割后批量转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:25:14