Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Jalankan pernyataan siap yang dihasilkan NHibernate di SQL Server Management Studio

Saya tahu Anda dapat melakukan ini dengan profiler nhibernate tetapi ini bukan alat gratis. Saya juga tertarik dengan alternatif gratis untuk melakukan ini.

http://nhprof.com/

Sunting

Sepertinya ada appender khusus di luar sana untuk log4net yang akan memformatnya sehingga Anda benar-benar dapat menjalankan sql NHibernate spits. Saya melihatnya di blog yang tercantum di bawah ini:

http://gedgei.wordpress.com/ 2011/09/03/logging-nhibernate-queries-with-parameters/

Di bawah ini adalah kode yang saya ambil dari blog di atas dan dimodifikasi agar berfungsi dengan Panduan:

/// <summary>
/// This log4net appender is used for outputting NHibernate sql statements in a sql management studio friendly format.
/// This means you should be able to copy the sql output from this appender and run it directly.  Normally in the NHibernate
/// output there is parameterized sql that must be manually edited to run it.
/// </summary>
public class NHibernateSqlAppender : ForwardingAppender
{
    private const string GuidRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";

    protected override void Append(LoggingEvent loggingEvent)
    {
        var loggingEventData = loggingEvent.GetLoggingEventData();

        if (loggingEventData.Message.Contains("@p"))
        {
            StringBuilder messageBuilder = new StringBuilder();

            string message = loggingEventData.Message;
            var queries = Regex.Split(message, @"command\s\d+:");

            foreach (var query in queries)
                messageBuilder.Append(ReplaceQueryParametersWithValues(query));

            loggingEventData.Message = messageBuilder.ToString();
        }

        base.Append(new LoggingEvent(loggingEventData));
    }

    public static string ReplaceQueryParametersWithValues(string query)
    {
        string returnQuery = Regex.Replace(query, @"@p\d+(?=[,);\s])(?!\s*=)", match =>
        {
            Regex parameterValueRegex = new Regex(string.Format(@".*{0}\s*=\s*(.*?)\s*[\[].*", match));
            return parameterValueRegex.Match(query).Groups[1].ToString();
        });

        //Place single quotes around all Guids in the sql string
        returnQuery = Regex.Replace(returnQuery, GuidRegex, "'$0'", RegexOptions.IgnoreCase);

        int parameterListIndex = returnQuery.LastIndexOf("@p0");

        if (parameterListIndex != -1)
        {
            //Truncate the paramter list off the end since we are substituting the actual values in the regular expression above
            //The -1 also cuts off the semicolon at the end
            return returnQuery.Substring(0, parameterListIndex).Trim();
        }

        return returnQuery.Trim();
    }
}

Inilah cara Anda mengirim output ini ke konsol:

<appender name="NHibernateSqlAppender" type="NHibernatePlayground.Custom.NHibernateSqlAppender, NHibernatePlayground">
    <appender-ref ref="console" />
</appender>

<root>
    <appender-ref ref="NHibernateSqlAppender" />
</root>

CATATAN:

Tampaknya ini menyebabkan beberapa masalah kinerja yang cukup signifikan dalam sistem produksi. Saya belum menemukan cara yang lebih baik untuk melakukan ini, tetapi bagi siapa pun yang menggunakan ini, waspadalah terhadap masalah kinerja ini



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbaiki "Setidaknya salah satu argumen untuk COALESCE harus berupa ekspresi yang bukan konstanta NULL" di SQL Server

  2. apakah mungkin untuk memilih EXISTS secara langsung sedikit?

  3. Membandingkan dua bitmask dalam SQL untuk melihat apakah ada bit yang cocok

  4. Basis data tidak dapat dibuka karena versi 851. Server ini mendukung versi 782 dan sebelumnya. Jalur penurunan versi tidak didukung

  5. Pengguna yang masuk akan keluar setelah beberapa waktu