2010-07-16 6 views
2

J'adore la fonctionnalité dans NHibernate qui montre le SQL généré. Mais quand je l'ai collé dans SQL Server Management Studio, j'ai réalisé que ce n'est pas vraiment valide!NHibernate show-sql - pourquoi le code SQL est-il invalide?

Voici un exemple:

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 

Ce n'est pas valide en raison de la façon dont est spécifié le paramètre p0. Il a besoin de:

DECLARE @p0 int 
SET @p0 = 1 

avant la commande SELECT. Je suppose que ma question est: pourquoi NHibernate n'affiche pas le SQL ACTUEL qu'il envoie à la base de données? Pourquoi le montre-t-il à la place?

Y a-t-il quelque chose qui me manque?

Merci

David

Répondre

6

La commande envoyée à SQL Server est envoyée est un argument chaîne de la procédure stockée système sp_executesql. La liste des paramètres est envoyée sous la forme d'une liste d'arguments de paire paramètre/valeur. Vous pouvez facilement voir cela en utilisant SQL Profiler. NHibernate Profiler reformate la requête en une que vous pouvez couper et coller dans SSMS.

Voici un exemple d'une charge d'objet NHibernate réel envoyé à 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' 

Depuis la requête est envoyée sous forme de chaîne à sp_executesql, vous pouvez obtenir un plan d'exécution qui est différent de celui généré en exécutant la requête directement. Dans certains cas, cela peut être un énorme coup de performance.

+0

Nous vous remercions de votre réponse très détaillée. – David

1

Le SQL est envoyé au conducteur comme une déclaration préparée, que ce soit le pilote SQL prend en charge l'assemblage du SQL final ou les paramètres sont envoyés séparement au serveur en cas de une instruction préparée côté serveur - ni sur laquelle hibernate a beaucoup de contrôle, ni aucun moyen de retirer le SQL final après l'avoir envoyé au pilote. Hibernate vous montre simplement le SQL paramétré ainsi que la valeur de @ p0 qu'il transmet au pilote SQL.

Questions connexes