diff --git a/src/NHibernate/Dialect/MsSql2005Dialect.cs b/src/NHibernate/Dialect/MsSql2005Dialect.cs
index bbba925251f..0bc03aec20c 100644
--- a/src/NHibernate/Dialect/MsSql2005Dialect.cs
+++ b/src/NHibernate/Dialect/MsSql2005Dialect.cs
@@ -5,6 +5,7 @@
using NHibernate.Mapping;
using NHibernate.SqlCommand;
using NHibernate.Util;
+using NHibernate.Dialect.Function;
namespace NHibernate.Dialect
{
@@ -36,6 +37,13 @@ protected override void RegisterKeywords()
RegisterKeyword("xml");
}
+ protected override void RegisterFunctions()
+ {
+ base.RegisterFunctions();
+ RegisterFunction("extract", new SQLFunctionTemplate(NHibernateUtil.Int32, "datepart(?1, ?3)"));
+ RegisterFunction("bit_length", new SQLFunctionTemplate(NHibernateUtil.Int32, "datalength(?1) * 8"));
+ }
+
public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit)
{
var result = new SqlStringBuilder();
@@ -170,7 +178,7 @@ private int GetAfterSelectInsertPoint(SqlString sql)
/// the statement to evaluate
/// true if the statment contains no parenthesis or an equal number of
/// opening and closing parenthesis;otherwise false
- private static bool HasMatchingParens(IEnumerable statement)
+ protected static bool HasMatchingParens(IEnumerable statement)
{
//unmatched paren count
int unmatchedParen = 0;
diff --git a/src/NHibernate/Dialect/MsSql2012Dialect.cs b/src/NHibernate/Dialect/MsSql2012Dialect.cs
new file mode 100644
index 00000000000..d75508736d3
--- /dev/null
+++ b/src/NHibernate/Dialect/MsSql2012Dialect.cs
@@ -0,0 +1,38 @@
+using System.Data;
+using NHibernate.Cfg;
+using NHibernate.Dialect.Function;
+using NHibernate.Driver;
+using NHibernate.SqlCommand;
+
+namespace NHibernate.Dialect
+{
+ public class MsSql2012Dialect : MsSql2008Dialect
+ {
+ public override SqlString GetLimitString(SqlString queryString, SqlString offset, SqlString limit)
+ {
+ var result = new SqlStringBuilder(queryString);
+
+ int orderIndex = queryString.LastIndexOfCaseInsensitive(" order by ");
+
+ //don't use the order index if it is contained within a larger statement(assuming
+ //a statement with non matching parenthesis is part of a larger block)
+ if (orderIndex < 0 || !HasMatchingParens(queryString.Substring(orderIndex).ToString()))
+ {
+ // Use order by first column if no explicit ordering is provided
+ result.Add( " ORDER BY ")
+ .Add("1");
+ }
+
+ result.Add(" OFFSET ")
+ .Add(offset ?? new SqlString("0"))
+ .Add(" ROWS");
+
+ if (limit != null)
+ {
+ result.Add(" FETCH FIRST ").Add(limit).Add(" ROWS ONLY");
+ }
+
+ return result.ToSqlString();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/NHibernate/NHibernate.csproj b/src/NHibernate/NHibernate.csproj
index 27cdff47865..4c43c990257 100644
--- a/src/NHibernate/NHibernate.csproj
+++ b/src/NHibernate/NHibernate.csproj
@@ -134,6 +134,7 @@
+