我喜欢NHibernate中显示生成的SQL的功能。但是当我将它粘贴到SQL Server Management Studio中时,我意识到它实际上并不合适!
以下是一个例子:
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 person0_.PersonId=@p0;@p0 = 1
由于指定了参数p0的方式,因此无效。它需要:
DECLARE @p0 int
SET @p0 = 1
在SELECT命令之前。
我想我的问题是:为什么NHibernate没有显示它发送到数据库的ACTUAL SQL?为什么会这样显示呢?
我有什么遗失的吗?
由于
大卫
答案 0 :(得分:6)
发送到SQL Server的命令是sp_executesql系统存储过程的字符串参数。参数列表作为参数,值对参数列表发送。您可以使用SQL事件探查器轻松查看此信息。 NHibernate Profiler将查询重新格式化为可以剪切并粘贴到SSMS中的查询。
以下是发送到SQL Server的实际NHibernate对象加载的示例:
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 track0_.Name=@p0',N'@p0 nvarchar(8)',@p0=N'6036HPGP'
由于查询作为字符串发送到sp_executesql,因此您可能会获得与直接执行查询所生成的执行计划不同的执行计划。在某些情况下,这可能会带来巨大的性能损失。
答案 1 :(得分:1)
SQL作为预准备语句发送给驱动程序,或者SQL驱动程序负责组装最终SQL,或者在服务器端预处理语句的情况下将参数单独发送到服务器 - 这两者都没有hibernate在将最终SQL发送给驱动程序后,控制或以任何方式撤回最终SQL。
hibernate只是向您展示参数化SQL以及它传递给SQL驱动程序的@p0的值。