2014-12-04 2 views
0

Я столкнулся с той же проблемой, что и в GO statements blowing up sql execution in .NET, и попытался реализовать решение, предложенное Мэттом Джонсоном, и прошу помощи в его работе. Я работаю с C# в течение пары месяцев, поэтому я все еще очень зеленый.Ошибка синтаксиса GO 'рядом с GO' при выполнении SQL

  1. Как это называется? Я попытался

    var cmd = SplitSqlStatements(cmd); 
    

    но получаю сообщение об ошибке:

    'Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'string'

  2. Не полностью понять Regex.Split но мой GO строка "\ г \ Ngo \ г \ п", так что я могу изменить, что Разделить от @"^\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); 
+0

Как только строка разделена, вам нужно выполнить каждое утверждение в цикле foreach? У вас есть код, где это происходит? – Hylaean

+0

Если вы строите строки вручную, почему вы пытаетесь включить утверждения 'GO' только для их удаления? –

+0

Просто FYI, ни один из этих SQL не требует «GO» для разделения пакетов. Он может быть запущен как единый 'SqlCommand'. Как и от «USE» до конца. Если вы не создаете процессы, функции или представления, это слишком усложняет один exec. –

ответ

1
  1. Вы повторно используете ту же переменную для ввода, что и для результата, поэтому , который не может работать. Используйте var cmd = SplitSqlStatements(sqlAll) или аналогичные вместо этого. var объявляет новую переменную с типом , выведенным по использованию.
  2. Если у вас никогда не было комментариев SQL по этим строкам, просто используйте "^\s*GO\s*$" как ваш шаблон. Остальное - обработать эти комментарии.
  3. №. @ "" - это просто способ уменьшить экранирование в строковых литералах; это не влияет на то, как вы используете строки (литералы или другие).
  4. Поменяйте их, если хотите, но если вы не передаете буквальную двухсимвольную последовательность \n SQL, это не имеет большого значения: они просто пробельные.
+0

Спасибо, ваши указатели заставили меня идти. Последний вопрос. Ссылка предостерегла о другом GO в скрипте. Возможно, символы GO могут иметь место в имени столбца. Как я могу предотвратить их удаление? –

+0

@ThomAsh:^и $ в привязке регулярных выражений к началу и концу строки соответственно, поэтому, если у вас нет столбца с именем GO all на своей собственной строке без запятой или чего-либо с каждой стороны, это не будет проблема. –

Смежные вопросы