NHibernate show-sql - почему SQL показывается неверным? - PullRequest
2 голосов
/ 16 июля 2010

Мне нравится функция 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 не показывает АКТУАЛЬНЫЙ SQL, который он отправляет в базу данных?Почему это показывает это вместо этого?

Есть ли что-то, что мне не хватает?

Спасибо

Дэвид

Ответы [ 2 ]

6 голосов
/ 16 июля 2010

Отправляемая на 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 track0_.Name=@p0',N'@p0 nvarchar(8)',@p0=N'6036HPGP'

Поскольку запрос отправляется в виде строки в sp_executesql, вы можете получить план выполнения, отличный от плана, сгенерированного непосредственным выполнением запроса.В некоторых случаях это может сильно повлиять на производительность.

1 голос
/ 16 июля 2010

SQL отправляется драйверу в виде подготовленного оператора, либо драйвер SQL заботится о сборке окончательного SQL, либо параметры отправляются на сервер отдельно в случае подготовленного оператора на стороне сервера - ни один из которых в hibernate не имеет многоконтроль или любой способ возврата окончательного SQL после его отправки в драйвер.

hibernate просто показывает вам параметризованный SQL, а также значение @ p0, которое он передает драйверу SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...