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();
		}
示例#2
0
        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;
			}
		}