sp_executesql возвращает результаты из представления, отличные от результатов прямого выполнения запроса

Я пытаюсь отладить отчет SSRS, который показывает некоторые сомнительные результаты. Я использую профилировщик sql. Я получил точный запрос, который он выполняет, который выполняется с помощью exec sp_executesql.

Запрос возвращает результаты из представления.

Если я запускаю запрос в его нынешнем виде, включая sp_executesql, я получаю один набор результатов. Если я возьму вложенный внутри запрос и выполню его самостоятельно, я получу другой набор результатов.

Понятия не имею, как это возможно. Запросы идентичны, и у меня создалось впечатление, что процедура sp_executesql просто выполняет запрос.

Что-то мне не хватает или как я могу отладить это дальше?

Вызов exec выглядит примерно так:

exec sp_executesql N'SELECT FirstName, LastName, DateOfBirth FROM ViewName WHERE
  DateOfBirth >= @pStartDate AND DateOfBirth <= @pEndDate',N'@pStartDate datetime, 
  @pEndDate datetime',@pDate='2010-07-17 00:00:00:000',@pEndDate=''2010-07-17
  23:59:59:000'

Если я запустил это, я получу один набор результатов.

Затем, если я бегу:

SELECT FirstName, LastName, DateOfBirth FROM ViewName WHERE 
     DateOfBirth >= '2010-07-17 00:00:00:000' AND
     DateOfBirth <= '2010-07-17 23:59:59:000'

Я получаю несколько иной набор результатов.


person ClickPOSAust    schedule 17.10.2011    source источник
comment
Есть ли возможность, что просмотр будет повторяться дважды с разными владельцами?   -  person Sparky    schedule 17.10.2011
comment
Нет ... Я также отбросил представление и воссоздал его на случай каких-либо странностей.   -  person ClickPOSAust    schedule 17.10.2011
comment
@gbn Простите, что вы имеете в виду?   -  person ClickPOSAust    schedule 17.10.2011
comment
Покажите нам вызов sp_executesql и определение представления.   -  person gbn    schedule 17.10.2011
comment
А определение вида?   -  person gbn    schedule 17.10.2011
comment
Я пришел сюда, потому что у меня была та же проблема, но потом я понял, что многие аргументы были в неправильном порядке. Ага.   -  person    schedule 20.09.2016


Ответы (2)


Я бы попытался вставить запрос как есть (удвоить одинарные кавычки) в exec sp_executesql и проверить результаты так же, как при ручном запуске. Если нет, то это будет как-то связано с параметром даты, если то же самое, то, скорее всего, это будет какой-то владелец / элемент безопасности.

person Andrew Jansen    schedule 18.10.2011
comment
Да, в конце концов, это была дата ... проходящая в параметрах была '2010-07-17 23: 59: 59: 000', которая по какой-то причине давала другой набор результатов при запуске без exec. Если я удалил компонент времени (в запросе, отличном от exec), он дал те же результаты. Я не знаю, почему это так ... - person ClickPOSAust; 19.10.2011
comment
Вероятно, это связано с тем, что ваша культура SQL Server форматирует параметр даты в свой собственный формат даты. - person Andrew Jansen; 19.10.2011
comment
Итак ... какой из них, возможно, будет отформатирован? Вызов sp_execute, или когда я запускаю запрос как есть? Я имею в виду ... как я могу узнать, что происходит, если это в какой-то момент форматируется? - person ClickPOSAust; 19.10.2011

  • Вероятно, вы подключаетесь с другим логином.

Это означает, что на результаты будет влиять фильтр, основанный на SUSER_SNAME или другой схеме (dbo.View vs OtherSchema.View). Возможно, это внутри вида.

  • У вас где-то есть различия NULL / пустой строки

  • Разные базы данных или сервер

person gbn    schedule 17.10.2011
comment
Я ничего подобного не вижу ... Я просто выполняю оба этих запроса локально, определенно указывая на одну и ту же базу данных ... - person ClickPOSAust; 17.10.2011
comment
Что дает вам использование dbo.ViewName? - person gbn; 17.10.2011