Как следует из названия, CreateSQLQuery предназначен для запросов, а не для вставки / обновления / удаления. Вызов типа sproc, который вы описываете, возможен, но не AFAIK через какой-либо механизм запросов, поддерживаемый NHibernate.
Сам sproc может быть включен в файл отображения через тег <database-object>
. Следующий пример для Sql Server:
<database-object>
<create>
<![CDATA[
go
create procedure dbo.SetFooBar
@Foo nvarchar(32)
@Bar nvarchar(32)
as
begin
...
end
go
]]>
</create>
<drop>
<![CDATA[
if object_id (N'dbo.SetFooBar', N'P') is not null
drop procedure dbo.SetFooBar;
go
]]>
</drop>
</database-object>
Ваш код может затем вызвать sproc. Для этого нужно заставить NHibernate создать для вас IDbCommand, заполнить его параметрами и вызвать его метод ExecuteNonQuery обычным способом ADO.NET:
private void SetFooBar(ISession session, string foo, string bar)
{
var connection = session.Connection;
var implementor = session.GetSessionImplementation();
var driver = implementor.Factory.ConnectionProvider.Driver;
var command = driver.GenerateCommand(CommandType.StoredProcedure,
new global::NHibernate.SqlCommand.SqlString("SetFooBar"),
new global::NHibernate.SqlTypes.SqlType[] {
global::NHibernate.SqlTypes.SqlTypeFactory.GetString(32),
global::NHibernate.SqlTypes.SqlTypeFactory.GetString(32),
});
command.Connection = connection;
SetParameter(command, 0, "@Foo", foo);
SetParameter(command, 1, "@Bar", foo);
command.ExecuteNonQuery();
}
private void SetParameter(IDbCommand cmd, int index, string name, object value)
{
IDataParameter param = (IDataParameter) cmd.Parameters[index];
param.ParameterName = name;
param.Value = value;
}