2015-05-06 2 views
0

Я не эксперт в 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 заявлении. может кто-нибудь подтвердить или опровергнуть это, или предоставить любую информацию, которая может помочь мне решить эту головоломку?

+4

Причина, по которой ее работа заключается в том, что sql обрабатывает как UserID из той же таблицы 'Users' внутри, что делает что-то вроде этого« Users.UserID = Users.UserID ». Измените свой код на 'HRMHolidayYears HY WHERE YearStart <= GETDATE() И HY.UserID = Users.UserID', и он начнет сбой – ughai

+0

Спасибо - кажется, сейчас очевидно! – DaveyWavey

ответ

1

с Qualifying Column Names in Subqueries:

Общее правило состоит в том, что имена столбцов в инструкции неявно квалифицируются таблицей, указанной в предложении FROM на том же уровне. Если столбец не существует в таблице, указанной в предложении FROM подзапроса, он неявно определяется таблицей, указанной в предложении FROM внешнего запроса.

В вашем примере вы имеете подзапрос (Внешние ОТНОСИТЬСЯ является отвлекающим маневром) и использовать неявно квалифицированное столбец UserID. Согласно приведенному выше правилу, поскольку на этом же уровне нет UserID, внешний запрос UserID будет использоваться неявно. QED.

 Смежные вопросы

  • Нет связанных вопросов^_^