У меня есть таблица в базе данных, а один из столбцов содержит xml, хранящийся как nvarchar. Мне нужно написать запрос и получить информацию на основе данных, хранящихся в этом столбце.Парсер запроса запроса NHibernate выдает ошибку в выражении '/ * [1]/@ type
Так что я в конечном итоге написание следующей родной запрос SQL, используя NHibernate:
string sql = @"SELECT a.id as s
FROM [DBT].[dbo].[tb_myTable] a
where (cast (a.vchExtendedInfo as XML)).value('/*[1]/@type','NVARCHAR(MAX)')='deal'"
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession().CreateSQLQuery(sql)
И выдает ошибку: «ArgumentOutOfRangeException» - длина не может быть меньше, чем имя zero.Parameter: длина.
После небольшого тестирования я узнал, что NHibernate пытается разобрать мой запрос и что строка '/*[1]/@type'
, вероятно, является причиной. (Это фактически упрощенный пример, и все остальные условия работают, если я удалю этот).
Итак, как мне избежать/исправить свой запрос, чтобы он работал?
Ну, я потратил немало времени на эту проблему. Я закончил с ошибкой, когда функция xml.value отказалась принять параметр как первое значение и только принятые строковые литералы. Я даже скопировал код, сгенерированный NHibernate, в SQL Studio и попытался заставить его работать там. Последнее полурабочее решение было тем, где я использовал подстановочный знак sql.variable [], и он не выдавал мне ошибок, но запрос дал неверные результаты (пустой запрос). – 1620k
Единственным рабочим решением, использующим NHibernate, было создание динамической строки SQL и передача ее в sql вместе с командой exec. Но у нас была некоторая озабоченность по поводу динамической производительности SQL при большой нагрузке, поэтому в итоге я просто закончил разрыв основного соединения с сеанса NHibernate и написал мое заявление с использованием ADO.NET, как предложил мой коллега. И он отлично работает. – 1620k
Значит, параметр, который я предлагаю, не работает? –