Код 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 ответа

  1. Это предварительная система. Я использую построитель отчетов
  2. Нет кэша - перезапуск сервера дал ту же проблему
  3. Sp_executesql генерируется службами отчетов - я не могу это контролировать

Я нашел решение, кстати. Похоже, это связано с тем, как отчет был создан или интерпретирован службами отчетности. Я создал ссылку на хранимую процедуру, вручную создав все параметры, и таким образом я решил проблему. Если вместо этого вы выбираете хранимую процедуру через интерфейс пользователя, он отправляет правильный код sp_executesql на сервер SQL. Между прочим, было довольно больно, но причина пока не ясна, но сейчас работает.

Это первый раз, когда я вижу амперсанд в имени базы данных!

Во всяком случае, вернемся к вопросу.

  1. Это в продакшн или визуальной студии?
  2. Есть ли какое-либо кэширование?
  3. Заполните ваш набор данных с помощью хранимой процедуры - в этом случае нет оправдания использованию sp_executesql!
  4. Если после всего этого проблема все еще происходит (я держу пари, что это не будет), запишите ваши параметры в таблицу в SP.
Другие вопросы по тегам