- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 
                        public void Parse(string sqlScript)
{
	batches = new List<string>();
	State state = State.WaitingGO;
	StartNewBatch();
	for(position = 0; position < sqlScript.Length; position++)
	{
		char c = sqlScript[position];
		if(state == State.WaitingGO)
		{
			PutToBuffer(c);
			if(IsWhiteSpace(c) || IsEndOfLineCharacter(c)) continue;
			else if(c == 'g' || c == 'G') state = State.ReadingGO;
			else
			{
				state = State.ReadingBatch;
				FlushBuffer();
			}
		}
		else if(state == State.ReadingGO)
		{
			PutToBuffer(c);
			if(c == 'o' || c == 'O') state = State.ReadedGO;
			else if(IsEndOfLineCharacter(c))
			{
				state = State.WaitingGO;
				FlushBuffer();
			}
			else
			{
				state = State.ReadingBatch;
				FlushBuffer();
			}
		}
		else if(state == State.ReadedGO)
		{
			if(IsWhiteSpace(c) || IsEndOfLineCharacter(c))
			{
				state = State.WaitingGO;
				FinishBatch();
				StartNewBatch();
			}
			else
			{
				state = State.ReadingBatch;
				PutToBuffer(c);
				FlushBuffer();
			}
		}
		else if(state == State.ReadingBatch)
		{
			PutToBatch(c);
			if(IsEndOfLineCharacter(c)) state = State.WaitingGO;
		}
	}
	if(state != State.ReadedGO) FlushBuffer();
	FinishBatch();
}
private enum State
{
	WaitingGO,
	ReadingGO,
	ReadedGO,
	ReadingBatch
}
                                     
        
            Требовалось распарсить string с sql-текстом на отдельные транзакции (т.е. просто разбить текст по go).
Функции для работы с Batch-ем не привожу и так уйма говнокода