Я столкнулся с той же проблемой, что и в GO statements blowing up sql execution in .NET, и попытался реализовать решение, предложенное Мэттом Джонсоном, и прошу помощи в его работе. Я работаю с C# в течение пары месяцев, поэтому я все еще очень зеленый.Ошибка синтаксиса GO 'рядом с GO' при выполнении SQL
Как это называется? Я попытался
var cmd = SplitSqlStatements(cmd);
но получаю сообщение об ошибке:
'Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'string'
Не полностью понять Regex.Split но мой GO строка "\ г \ Ngo \ г \ п", так что я могу изменить, что Разделить от
@"^\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);
Как только строка разделена, вам нужно выполнить каждое утверждение в цикле foreach? У вас есть код, где это происходит? – Hylaean
Если вы строите строки вручную, почему вы пытаетесь включить утверждения 'GO' только для их удаления? –
Просто FYI, ни один из этих SQL не требует «GO» для разделения пакетов. Он может быть запущен как единый 'SqlCommand'. Как и от «USE» до конца. Если вы не создаете процессы, функции или представления, это слишком усложняет один exec. –