2010-07-16 34 views
2

我喜歡NHibernate中顯示生成的SQL的功能。但是當我將它粘貼到SQL Server Management Studio中時,我意識到它並不是真正有效的!NHibernate show-sql - 爲什麼SQL顯示無效?

下面是一個例子:

SELECT person0_.PersonId as PersonId1_0_, person0_.Title as Title1_0_, person0_.FirstName as FirstName1_0_, person0_.MiddleNames as MiddleNa4_1_0_, person0_.LastName as LastName1_0_ FROM Kctc.People person0_ WHERE [email protected];@p0 = 1 

這是因爲指定的參數P0的方式無效。它需要:

DECLARE @p0 int 
SET @p0 = 1 

之前的SELECT命令。

我想我的問題是:爲什麼NHibernate不顯示它發送到數據庫的ACTUAL SQL?爲什麼它會顯示這個呢?

有什麼我失蹤了嗎?

感謝

大衛

回答

6

發送到SQL Server的命令是發送到sp_executesql系統存儲過程的字符串參數。參數列表作爲參數,值對參數列表發送。您可以使用SQL Profiler輕鬆查看。 NHibernate Profiler將查詢重新格式化爲一個可以剪切並粘貼到SSMS中的查詢。

這裏是一個真正的NHibernate的目標負載的例子爲發送到SQL Server:

exec sp_executesql N'SELECT track0_.TrackId as TrackId84_0_, track0_.CreatedBy as CreatedBy84_0_, track0_.CreatedDt as CreatedDt84_0_, track0_.RevisedBy as RevisedBy84_0_, track0_.RevisedDt as RevisedDt84_0_, track0_.Name as Name84_0_, track0_.Description as Descript7_84_0_ FROM Nucleus.Track track0_ WHERE [email protected]',N'@p0 nvarchar(8)',@p0=N'6036HPGP' 

由於查詢被作爲一個字符串sp_executesql的,你可能會得到一個執行計劃比產生的一個不同通過直接執行查詢。在某些情況下,這可能會造成巨大的性能下降。

+0

非常感謝您的詳細解答。 – David 2010-07-16 12:36:45

1

的SQL發送到驅動程序作爲一個事先準備好的聲明,無論是SQL驅動程序將組裝最終SQL的護理或參數在的情況下seperatly發送到服務器服務器端準備好的語句 - 這兩種語言都沒有太多的控制權,或者在將最終的SQL發送到驅動程序之後將其撤回。

hibernate只是向您顯示參數化的SQL以及它交給SQL驅動程序的@ p0的值。