2014-12-04 4 views
0

GO statements blowing up sql execution in .NET과 같은 문제가 발생했습니다. Matt Johnson이 제공하는 솔루션을 구현하려고 시도했으며 작동에 도움이 필요합니다. 저는 C#으로 몇 달간 작업했기 때문에 여전히 매우 녹색입니다.GO 실행시 'GO'구문 오류가 발생합니다.

  1. 어떻게 호출하나요? 나는

    var cmd = SplitSqlStatements(cmd); 
    

    을 시도했지만 오류 얻을 :

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

  2. 완전히 Regex.Split 이해하지 마십시오을하지만 내 GO 문자열은 "\ 연구 NGO \ \ 연구 \ n"그래서 나는 것을 바꿀 것입니다 @"^\s*GO\s* ($ | \-\- .*$)"에서 @"^\r\nGO\r\n$ | \-\- .*$)"으로 분할 하시겠습니까? | \-\- .*$이 무엇인지 전혀 알지 못합니다.

  3. 내 문자열은 +와 연결할하지만 난 볼 @ "시작 부분에. 내가 필요로하는이 평균은 없애 않음 +?
  4. 내 문자열은 '\ 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); 
+0

일단 문자열이 분할되면 foreach 루프에서 각 명령문을 실행해야합니까? 이런 일이 발생하는 코드가 있습니까? – Hylaean

+0

문자열을 직접 작성하는 경우 왜 'GO'문만 포함 시켜서 제거 할 수 있습니까? –

+0

참고로이 SQL에서는 배치를 구분하는 데 "GO"가 필요하지 않습니다. 그것은 모두 하나의'SqlCommand'로 실행될 수 있습니다. "USE"에서 끝까지. procs, 함수 또는 뷰를 작성하지 않는 한이 방법은 단일 exec를 복잡하게 만듭니다. –

답변

1
  1. 결과와 같이 입력 할 때 동일한 변수를 사용하고 있으므로 이 작동하지 않을 수 있습니다. 대신 var cmd = SplitSqlStatements(sqlAll) 또는 유사하게 사용하십시오. var은 사용법에 의해 유추 된 유형이 인 새 변수를 선언합니다.
  2. 해당 줄에 SQL 주석이없는 경우 "^\s*GO\s*$" 을 패턴으로 사용하십시오. 나머지는 이러한 주석을 처리하는 것입니다.
  3. 아니요 @ ""은 문자열 리터럴에서 이스케이프 처리를 줄이는 방법 일뿐입니다. 문자열 (리터럴 또는 기타)을 사용하는 방식에는 영향을 미치지 않습니다.
  4. 원하는 경우 스왑합니다. 그러나 문자 2 문자 시퀀스 \n을 SQL에 전달하지 않는 한 SQL에 아무런 영향을 미치지 않습니다. 단지 공백 문자입니다.
+0

고마워, 너의 포인터가 나를 잡았다. 마지막 질문 하나. 이 링크는 스크립트에서 다른 GO에 대해주의를주었습니다. 문자 GO가 열 이름에 나타날 수 있습니다. 어떻게 제거 될 수 있습니까? –

+0

@ThomAsh : 행의 시작과 끝 부분에있는^및 $을 정규식의 앵커로 각각 지정하므로 GO라는 이름의 열이 쉼표 나 양쪽에없는 자체 행에 없으면 문제. –

관련 문제