Код sp_executesql, сгенерированный службами отчетов, возвращает неправильные значения
Я использовал хранимую процедуру с параметрами для генерации набора результатов для моего отчета в службах отчетов 2012, но возвращенный результат неверен. Я проследил сгенерированную команду и вот она:
EXEC sp_executesql N'EXECUTE [Controls&Compliance].[dbo].[GetAccountsDetails_2]'
,N'@Region nvarchar(4000),@Market nvarchar(4000),@SiteID nvarchar(4000),@ServerClass nvarchar(4000),@InstanceName nvarchar(4000),@LoginName nvarchar(8)'
,@Region = NULL
,@Market = NULL
,@SiteID = NULL
,@ServerClass = NULL
,@InstanceName = NULL
,@LoginName = N'1C_admin'
Эта команда генерирует тысячи строк.
Странно то, что если я выполню код за пределами sp_executesql
вернет правильный результат (1 строка):
EXECUTE [Controls&Compliance].[dbo].[GetAccountsDetails_2] @Region = NULL
,@Market = NULL
,@SiteID = NULL
,@ServerClass = NULL
,@InstanceName = NULL
,@LoginName = N'1C_admin'
Я прочитал статью о проблеме, вызванной неправильным порядком параметров, но это не так. Я также проверил тип данных параметра, и все они одного типа.
Может ли кто-нибудь помочь понять, почему такое поведение и как его избежать?
2 ответа
- Это предварительная система. Я использую построитель отчетов
- Нет кэша - перезапуск сервера дал ту же проблему
- Sp_executesql генерируется службами отчетов - я не могу это контролировать
Я нашел решение, кстати. Похоже, это связано с тем, как отчет был создан или интерпретирован службами отчетности. Я создал ссылку на хранимую процедуру, вручную создав все параметры, и таким образом я решил проблему. Если вместо этого вы выбираете хранимую процедуру через интерфейс пользователя, он отправляет правильный код sp_executesql на сервер SQL. Между прочим, было довольно больно, но причина пока не ясна, но сейчас работает.
Это первый раз, когда я вижу амперсанд в имени базы данных!
Во всяком случае, вернемся к вопросу.
- Это в продакшн или визуальной студии?
- Есть ли какое-либо кэширование?
- Заполните ваш набор данных с помощью хранимой процедуры - в этом случае нет оправдания использованию sp_executesql!
- Если после всего этого проблема все еще происходит (я держу пари, что это не будет), запишите ваши параметры в таблицу в SP.