2010-07-16 5 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를 지정하는 방식이 유효하지 않습니다. SELECT 명령 전에

DECLARE @p0 int 
SET @p0 = 1 

이 필요합니다.

내 질문에 : 나는 왜 NHibernate가 데이터베이스에 보내는 ACTUAL SQL을 보여주지 않는가? 대신 왜 이것을 보여 줍니까?

내가 누락 된 자료가 있습니까?

감사

데이비드

답변

6

SQL Server로 보내지는 명령은 sp_executesql 시스템 저장 프로 시저에 대한 문자열 인수입니다. 매개 변수 목록은 매개 변수, 값 쌍 인수 목록으로 전송됩니다. SQL 프로파일 러를 사용하면 쉽게 확인할 수 있습니다. NHibernate Profiler은 쿼리를 SSMS로 잘라 붙여 넣을 수있는 형식으로 다시 포맷합니다. 여기

는 SQL Server로 전송로 실제 NHibernate에 개체 부하의 예 : 쿼리에서 sp_executesql에 문자열로 전송되기 때문에

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' 

, 당신은 생성 된 하나와 다른 실행 계획을 얻을 수 있습니다 쿼리를 직접 실행하여 어떤 경우에는 엄청난 성과를 낼 수 있습니다.

+0

매우 자세히 답변 해 주셔서 감사합니다. – David

1

는 SQL이 준비된 문으로 드라이버로 전송, 어느 SQL 드라이버가 최종 SQL 조립을 담당하거나 매개 변수가의 경우 서버에 각각 따로 전송됩니다 서버 측 준비문 - 최대 절전 모드가 드라이버에 전송 된 후 최종 SQL을 철저히 제어하거나 제어 할 수 없습니다.

hibernate는 매개 변수화 된 SQL과 @ p0의 값을 SQL 드라이버에 전달한다는 것을 보여줍니다.

관련 문제