2012-03-31 44 views
2

我需要知道如何修改一个sql,添加到每一个select sql代码中。 我的问题是,我需要在“FROM table”+“sql_code”之后添加此sql代码,即使“像GROUP BY”之后有某种东西。修改NHibernate中的SQL

我知道我需要使用OnPrepareStatement,我只是不知道如何编辑SqlString来这么做!

有一两件事,我已经试过:

public override SqlString OnPrepareStatement(SqlString sql) 
    { 
     if (sql.Parts.Cast<string>().FirstOrDefault().Trim().ToLower() != "select") 
     { 
      return sql; 
     } 
     StringBuilder novaString = new StringBuilder(sql.ToString()); 
     String corte = sql.SubstringStartingWithLast("where").ToString(); 
     if (corte != "") 
     { 
      StringBuilder sb = new StringBuilder(corte); 
      sb.Insert(0, "with(nolock) "); 
      novaString.Replace(corte, sb.ToString()); 
     } 
     else 
     { 
      novaString.Append(" with(nolock)"); 
     } 
     return new SqlString(novaString.ToString()); 
    } 

谢谢!

+0

我不知道这意味着什么。我会的,对不起! – Leonardo 2012-03-31 15:12:51

+0

他意味着你需要在每个你以前的问题中标记一个答案为“接受”,即如果有答案并且他们有帮助。 – gdp 2012-03-31 17:37:40

+0

是的,我得到了那部分!你对我的问题有任何想法吗?多谢你们 ! – Leonardo 2012-04-01 05:19:12

回答

1

我对派对有点迟到,但这里是我如何optomize我们的一些疑问。下面的需要定的SQL语句,并附加一点点到最后:

public class OptionInterceptor: EmptyInterceptor 
{ 
    public override SqlString OnPrepareStatement(SqlString sql) 
    { 
     var parameters = sql.GetParameters(); 
     var paramCount = parameters.Count(); 

     if (paramCount > 0) 
      return sql; 

     string optionString = " OPTION (OPTIMIZE FOR ("; 

     for (var i = 0; i < paramCount; i++) 
     { 
      var comma = i > 0 ? "," : string.Empty; 
      optionString = optionString + comma + "@p" + i + " UNKNOWN"; 
     } 

     optionString = optionString + "))"; 

     var builder = new SqlStringBuilder(sql); 

     builder.Add(optionString); 

     return builder.ToSqlString(); 
    } 
} 
0

有点为时已晚,但仍。我不得不添加一个提示到生成的sql:

private class SqlLogger : EmptyInterceptor 
{ 
    private const string Select = "SELECT"; 
    private const int SelectLen = 6; 
    private const string Hint = " /*+ dynamic_sampling(0) */"; 
    private const char Param = '?'; 

    public override SqlString OnPrepareStatement(SqlString sql) 
    { 
     var s = sql.ToString().ToUpper(); 
     var start = s.IndexOf(Select, StringComparison.Ordinal); 
     if (start != -1) 
      s = s.Insert(SelectLen, Hint); 

     var builder = new SqlStringBuilder(); 
     var parts = s.Split(Param); 
     for (var i = 0; i < parts.Length - 1; i++) 
     { 
      builder.Add(parts[i]); 
      builder.AddParameter(); 
     } 
     builder.Add(parts.Last()); 
     sql = builder.ToSqlString(); 

     return sql; 
    } 
}