在 SQL 执行中 GO 中的“接近 GO 的语法错误”
本文关键字:GO 语法 错误 接近 中的 SQL 执行 | 更新日期: 2023-09-27 18:33:17
我遇到了与 GO 语句中相同的问题,在 .NET 中破坏了 sql 执行,并尝试实现 Matt Johnson 提供的解决方案,并寻求帮助使其工作。 我已经使用 C# 几个月了,所以我仍然很环保。
-
这怎么称呼? 我试过了
var cmd = SplitSqlStatements(cmd);
但收到错误:
"无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'string'
-
不完全理解正则表达式.Split,但我的GO字符串是"''r'GO''r'",所以我会把这个拆分从
@"^'s*GO's* ($ | '-'- .*$)"
更改为@"^'r'nGO'r'n$ | '-'- .*$)"
吗? 我不知道| '-'- .*$
是做什么的。 - 我的字符串与 + 连接,但我在开头看到 @"。 这是否意味着我需要摆脱 + 连接?
- 我的字符串在我尝试插入换行符的地方有 + ''' +,这些字符串可以替换为 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);
- 您正在对输入重复使用与结果相同的变量,因此这不可能奏效。使用
var cmd = SplitSqlStatements(sqlAll)
或类似。var
声明一个具有类型的新变量通过使用情况推断。 - 如果这些行上从来没有 SQL 注释,只需使用
"^'s*GO's*$"
作为你的模式。剩下的就是处理这些评论。 - @" 只是减少字符串文字中转义的一种方式;它不会影响使用字符串(文字或其他(的方式。
- 如果需要,可以交换它们,但除非您将文字两字符序列
'n
传递给 SQL,否则这无关紧要:它们只是空格。