Я не эксперт в T-SQL, и у меня есть проблема (или, вернее, у меня нет проблемы, но я действительно думаю, что должен), которую я надеюсь, что вы можете пролить некоторые расскажите о том, почему.Обработка ошибок SQL Server в OUTER APPLY
У меня есть хранимая процедура (SQL Server 2012), которая, как я считаю, должна дать мне ошибку - но это не так. Мой google-fu подвел меня, и я не нашел ничего, чтобы указать мне в правильном направлении. Таким образом, мы используем следующие таблицы:
**USERS**
UserID int
...
**HolidayYears**
HolidayYearID int
UserID int
...
**HolidayYearUserBalances**
BalanceID int
HolidayYearID int
...
Хранимая процедура создает отчет, который отображает пользователей и их остатки отпуска в текущем году праздник. Для этого я использую OUTER APPLY:
OUTER APPLY (
SELECT TOP 1
HolidayYearID,
YearStart,
YearEnd
FROM HRMHolidayYears
WHERE YearStart <= GETDATE()
AND
UserID = Users.UserID
ORDER BY YearStart DESC
) hy
Это работает абсолютно нормально, и это именно то, что я хочу. Проблема заключается в следующем:
Вчера эта хранимая процедура была передана клиенту, который работает с более старой версией нашего приложения. В этой версии, HolidayYear не связан с пользователем, а все пользователи имеют один и тот же HolidayYear. Таким образом, таблица HolidayYears не имеет столбца «UserID».
Так я ожидаю, что эта хранимая процедура выдаст ошибку, и если я исполню SELECT
, содержащийся в OUTER APPLY
в изоляции, он действительно бросить ожидаемую ошибку (Invalid имени столбца 'UserID'
).
Что действительно происходит при запуске отчета, так это то, что строки возвращаются без ошибок, однако поля, относящиеся к балансу пользователя, являются NULL (как и следовало ожидать, если OUTER APPLY
не смог вернуть записи для Года отпуска, JOIN
к HolidayYearUserBalances
таблице.
Я сделал дикое предположение, что T-SQL подавляющей ошибок в OUTER APPLY
заявлении. может кто-нибудь подтвердить или опровергнуть это, или предоставить любую информацию, которая может помочь мне решить эту головоломку?
Причина, по которой ее работа заключается в том, что sql обрабатывает как UserID из той же таблицы 'Users' внутри, что делает что-то вроде этого« Users.UserID = Users.UserID ». Измените свой код на 'HRMHolidayYears HY WHERE YearStart <= GETDATE() И HY.UserID = Users.UserID', и он начнет сбой – ughai
Спасибо - кажется, сейчас очевидно! – DaveyWavey