2012-03-31 2 views
2

Мне нужно знать, как изменить sql, чтобы добавить к каждому элементу код sql. Моя проблема: мне нужно добавить этот код sql после таблицы «FROM» + «sql_code», даже если есть что-то после «как GROUP BY».Изменение SQL в NHibernate

Я знаю, что мне нужно использовать 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

+0

Он означает, что вам нужно отметить один из ответов в каждом из ваших предыдущих вопросов как «принятый», то есть если есть ответы, и они помогли. – gdp

+0

да, я получил эту часть! Есть ли у вас какие-либо представления о моей проблеме? Спасибо, парни ! – Leonardo

ответ

1

Я немного опоздал на вечеринку, но вот как я оплотирую некоторые из наших запросов. Ниже принимает данный 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; 
    } 
} 
Смежные вопросы