在 SQL 执行中 GO 中的“接近 GO 的语法错误”

本文关键字:GO 语法 错误 接近 中的 SQL 执行 | 更新日期: 2023-09-27 18:33:17

我遇到了与 GO 语句中相同的问题,在 .NET 中破坏了 sql 执行,并尝试实现 Matt Johnson 提供的解决方案,并寻求帮助使其工作。 我已经使用 C# 几个月了,所以我仍然很环保。

  1. 这怎么称呼? 我试过了

    var cmd = SplitSqlStatements(cmd);
    

    但收到错误:

    "无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'string'

  2. 不完全理解正则表达式.Split,但我的GO字符串是"''r'GO''r'",所以我会把这个拆分从@"^'s*GO's* ($ | '-'- .*$)"更改为@"^'r'nGO'r'n$ | '-'- .*$)"吗? 我不知道| '-'- .*$是做什么的。

  3. 我的字符串与 + 连接,但我在开头看到 @"。 这是否意味着我需要摆脱 + 连接?
  4. 我的字符串在我尝试插入换行符的地方有 + ''' +,这些字符串可以替换为 System.Environment.Newline 还是应该完全删除它们?

法典:

private static IEnumerable<string> SplitSqlStatements(string sqlScript)
{
    // Split by "GO" statements
    var statements = Regex.Split(
        sqlScript,
        @"^'s*GO's* ($ | '-'- .*$)",
        RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
    // Remove empties, trim, and return
    return statements
        .Where(x => !string.IsNullOrWhiteSpace(x))
        .Select(x => x.Trim(' ', ''r', ''n'));
}

我的字符串示例:

string sqlHeader = " Use " + "R04_FDW  " + "'r'nGO'r'n" + "SET ANSI_NULLS ON" + "'r'nGO'r'n" + "SET QUOTED_IDENTIFIER ON" + "'r'nGO'r'n" + "SET ANSI_PADDING ON" + "'r'nGO'r'n";
string sqlName = "CREATE TABLE " + dwSchema + "." + dwTN + "  (" + ''n';
string sqlNonCluster = "CREATE UNIQUE NONCLUSTERED INDEX [ak_" + dwTN + "__Sta3n_PrimaryKeys]" + "  ON [" + dwSchema + "].[" + dwTN + "]" + ''n' + "(" + ''n';
SqlCommand cmd = new SqlCommand(sqlHeader + sqlName + sqlColumns + sqlFoot + sqlCluster + sqlNonCluster, vx130);

在 SQL 执行中 GO 中的“接近 GO 的语法错误”

  1. 您正在对输入重复使用与结果相同的变量,因此这不可能奏效。使用var cmd = SplitSqlStatements(sqlAll)或类似。 var声明一个具有类型的新变量通过使用情况推断。
  2. 如果这些行上从来没有 SQL 注释,只需使用 "^'s*GO's*$"作为你的模式。剩下的就是处理这些评论。
  3. @" 只是减少字符串文字中转义的一种方式;它不会影响使用字符串(文字或其他(的方式。
  4. 如果需要,可以交换它们,但除非您将文字两字符序列'n传递给 SQL,否则这无关紧要:它们只是空格。