private static List <string> GetParameterNames(string sql) { List <string> l = new List <string>(); Dictionary <string, bool> dict = new Dictionary <string, bool>(); TokenizedSQL tsql = new TokenizedSQL(sql); int n = tsql.Tokens.Length; for (int i = 0; i < n; i++) { Token t = tsql.Tokens[i]; if (t.ID == TokenID.Colon) { i++; t = tsql.Tokens[i]; Token t0 = t; for (; i < n && tsql.Tokens[i].ID == TokenID.Identifier; t = tsql.Tokens[i++]) { ; } string p = DequoteIdentifier(tsql.Extract(t0, t)); if (!dict.ContainsKey(p)) { l.Add(p); dict.Add(p, true); } } } return(l); }
public override SQLParts SplitSQL(string sql) { List <SQLPart> l = new List <SQLPart>(); TokenizedSQL tsql = new TokenizedSQL(sql); int i = 0; int n = tsql.Tokens.Length; while (i < n) { //Token t = tsql.Tokens[i]; for (; i < n; i++) { Token t = tsql.Tokens[i]; if (t.Kind != TokenKind.Space && t.Kind != TokenKind.NewLine && t.Kind != TokenKind.Comment) { break; } } int i0 = i; Token t0 = tsql.Tokens[i0]; bool endByNewLine = false; if (t0.Kind == TokenKind.Identifier && (string.Compare(t0.Value, "begin") == 0 || string.Compare(t0.Value, "start") == 0)) { endByNewLine = true; } for (; i < n && tsql.Tokens[i].Kind != TokenKind.Semicolon && (!endByNewLine || tsql.Tokens[i].Kind != TokenKind.NewLine); i++) { ; } string s = tsql.Extract(t0, tsql.Tokens[i - 1]); SQLPart sp = new SQLPart() { Offset = t0.Start.Index, SQL = s, ParameterNames = GetParameterNames(s).ToArray(), }; l.Add(sp); i++; } return(new SQLParts() { Items = l.ToArray(), ParameterNames = GetParameterNames(sql).ToArray() }); }