public override SqlString GetLimitString(SqlString querySqlString, SqlString offset, SqlString limit) { var tokenEnum = new SqlTokenizer(querySqlString).GetEnumerator(); if (!tokenEnum.TryParseUntilFirstMsSqlSelectColumn()) return null; var result = new SqlStringBuilder(querySqlString); if (!tokenEnum.TryParseUntil("order")) { result.Add(" ORDER BY CURRENT_TIMESTAMP"); } result.Add(" OFFSET "); if (offset != null) { result.Add(offset).Add(" ROWS"); } else { result.Add("0 ROWS"); } if (limit != null) { result.Add(" FETCH FIRST ").Add(limit).Add(" ROWS ONLY"); } return result.ToSqlString(); }
public override SqlString GetLimitString(SqlString querySqlString, SqlString offset, SqlString limit) { using (var tokenEnum = new SqlTokenizer(querySqlString).GetEnumerator()) { if (!tokenEnum.TryParseUntilFirstMsSqlSelectColumn()) { return(null); } var result = new SqlStringBuilder(querySqlString); if (!tokenEnum.TryParseUntil("order")) { result.Add(" ORDER BY CURRENT_TIMESTAMP"); } result.Add(" OFFSET "); if (offset != null) { result.Add(offset).Add(" ROWS"); } else { result.Add("0 ROWS"); } if (limit != null) { result.Add(" FETCH FIRST ").Add(limit).Add(" ROWS ONLY"); } return(result.ToSqlString()); } }
public MsSqlSelectParser(SqlString sql) { if (sql == null) throw new ArgumentNullException("sql"); this.Sql = sql; this.SelectIndex = this.FromIndex = this.OrderByIndex = -1; var tokenEnum = new SqlTokenizer(sql).GetEnumerator(); tokenEnum.MoveNext(); // Custom SQL may contain multiple SELECT statements, for example to assign parameters. // Therefore we loop over SELECT statements until a SELECT is found that returns data. SqlToken selectToken; bool isDistinct; if (tokenEnum.TryParseUntilFirstMsSqlSelectColumn(out selectToken, out isDistinct)) { this.SelectIndex = selectToken.SqlIndex; this.IsDistinct = isDistinct; _columns.AddRange(ParseColumnDefinitions(tokenEnum)); if (tokenEnum.TryParseUntil("from")) { this.FromIndex = tokenEnum.Current.SqlIndex; SqlToken orderToken; if (tokenEnum.TryParseUntilFirstOrderColumn(out orderToken)) { this.OrderByIndex = orderToken.SqlIndex; foreach (var order in ParseOrderDefinitions(tokenEnum)) { _orders.Add(order); if (!order.Column.InSelectClause) { _columns.Add(order.Column); } } } } return; } }