2013-02-15 1 views
0

.SQL 파일 C#으로 DDL에서 이름을 반대하는 다음과 같은 문장이 있습니다정규식은 테이블, 트리거, 뷰 등</p> <p>그것은 수에 대한 문을 변경, 저장 프로 시저를 분석하고 나는 여러 저장 프로 시저의 DDL 정의를 포함 할 수있는 .SQL 파일이

  • 것은 CREATE/절차를 PROC를 만들
  • ALTER PROC/ALTER PROCEDURE
  • DROP의 PROC/DROP PROCEDURE
  • CREATE TABLE/트리거/V IEW
  • ALTER 표/TRIGGER/VIEW
  • DROP 표/TRIGGER/VIEW

무엇 (PROC을 .SQL 파일을 구문 분석하고 단지 개체의 목록을 얻을 수있는 가장 좋은 방법은/테이블/뷰 이름)과 그 (ALTER/CREATE/DROP)에서 취해지고있는 동작 중 무엇입니까? Microsoft.Data.Schema.ScriptDom 또는 ANTLR 또는 다른 파서와 같은 것들을 사용하는 대신 가장 쉬운 방법은 RegEx를 사용하는 것입니다. 그러나 모든 시나리오를 다루는 RegEx의 종류를 분명히해야합니다.

지금까지이 표현식은 위의 모든 규칙과 일치 할 수 있습니다. 그러나 나는 그것 앞에있는 물체의 이름을 어떻게 얻습니까? 예. 그것은 일치

(작성 | 변경 | 드롭) \ S + (절차 | PROC | 테이블 | 트리거 |보기 | 기능 | 제약) 내 질문 이름 AdvisorGroups을 얻는 방법

. 내 RegEx는 [dbo]를 (를) 가질 수 있기 때문에 불완전합니다. 그것의 앞에 또는 아닙니다. AdvisorGroups 테이블 변경도 가능합니다. 나는 모든 가능성을 돌 보려고하지 않습니다. 최소한으로. 확실히 ... 당신이 필요합니다 -.

+0

성명을 분석하거나이 문장을 파싱하지 않으려는 시도는 무엇입니까? –

+0

우리는 DBA가 영향을받는 객체를 수동으로 백업하지 않고 실행을 위해 .SQL procs를 실행하기위한 사내 도구를 만들었습니다. 시작을하고 문제가 발생하면 수동으로 롤백합니다. 그래서이 도구는 .SQL 파일을받습니다. 모든 개체 이름을 구문 분석하고 백업 한 다음 .sql을 실행합니다. – StackThis

+0

백업 할 때 개체의 스키마/정의를 의미합니까? 아니면 데이터를 의미합니까? MS SQL 용인가요? 그렇다면 어떤 버전입니까? –

답변

1

나는 그것을 직접 해결했다. 누군가가 도움이되기를 바랍니다. 그래서 ALTER, DROP의 뒤범벅을 포함하는 문자열, CREATE PROC/TABLE/트리거/FUNCTION

Regex DDL = new Regex(@"(?<=\b(create|alter|drop)\s+(procedure|proc|table|trigger|view|function)\b\s\[dbo\].)\[.*?\]", RegexOptions.IgnoreCase); 
    Match match = DDL.Match(inputScript); 
    while(match.Success) 
    { 
     textBox2.Text += "\r\n" + match.Groups[1].Value + " - " + match.Groups[2].Value + " - " + match.Value; 
     match = match.NextMatch(); 
    } 
    textBox3.Text = "DONE"; 

에 대한이 같은 출력을 얻을 것이다.

  • 만들기 -보기 -
  • 는 CREATE vwEmployees - 표 - tblSalaries
  • DROP - PROC - spGetEmployees
  • ALTER - 표 - tblSalaries

이 코드의 awesomeness에가, 그되지 않습니다 그것은 영향을받는 객체를 제공 할 뿐이지 만 객체의 종류 (예 : 테이블, proc, 뷰)와 조작 (예 : 생성/변경/삭제)을 제공합니다. 이 모든 것은 성냥 [1], 성냥 [2] 등에서 이용 가능합니다.

+0

스키마와 개체 이름이 대괄호로 정규화되지 않은 경우 어때? –

+0

동의 함, @db_brad. 또한 ... * 개체 이름에 포함 된 괄호가 하나 이상 있거나 '.' 문자? * 스키마 이름이 dbo가 아니면 어떻게됩니까? SQL 개체 이름을 구문 분석하기가 어렵습니다. T-SQL은 T-SQL 스크립트에서 (상대적으로) 프로세스를 간단하게 만드는'parsename()'과'quotename()'을 제공합니다. 그러나, 나는 닷넷 언어 (C#, VB 등)에서 사용할 수있는 유사한 기능을 SMO의 'System.Data.Sql *'에 'Net ... 아무데도'찾을 수 없었다. – RickC

+0

자신의 (매우 불완전한) SQL "파서"를 "멋진 [ness]"로 설명하기 위해 Downvoted –

2
정규식이 작업이 수행되지 않습니다

ALTER TABLE [dbo가] [AdvisorGroups] 미리 CONSTRAINT [XXX]

고마워요 담기 실제 파서 - this one (상업용)과 같습니다.