SQL OUTER APPLY 中的服务器错误处理

SQL Server Error Handling within OUTER APPLY

我不是 T-SQL 的专家,我有一个问题(或者更确切地说,我没有问题,但我真的认为我应该),我希望你能阐明一些问题至于为什么。

我有一个存储过程 (SQL Server 2012),我认为它应该给我一个错误 - 但它没有。我的 google-fu 让我失望了,我没有找到任何指向正确方向的东西。总之,我们使用以下 tables:

**USERS**
UserID int
...

**HolidayYears**
HolidayYearID int
UserID int
...

**HolidayYearUserBalances**
BalanceID int
HolidayYearID int
...

存储过程生成一个报告,显示用户及其在当前假期的假期余额。为此,我使用外部应用:

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 table 没有列 'UserID'.

所以我的预期是这个存储过程会抛出一个错误,如果我单独执行 OUTER APPLY 中包含的 SELECT,它确实会抛出预期的错误(无效的列名'UserID').

当您 运行 报告时实际发生的是行 returned 没有错误,但是与用户余额相关的字段为 NULL(如果 OUTER APPLY 未能 return 记录假日年,然后 JOINHolidayYearUserBalances table。

我大胆地假设 T-SQL 会抑制 OUTER APPLY 语句中的错误。任何人都可以证实或否认这一点,或者提供任何可能帮助我解决这个难题的信息吗?

来自Qualifying Column Names in Subqueries

The general rule is that column names in a statement are implicitly qualified by the table referenced in the FROM clause at the same level. If a column does not exist in the table referenced in the FROM clause of a subquery, it is implicitly qualified by the table referenced in the FROM clause of the outer query.

在您的示例中,您有一个子查询(OUTER APPLY 是一条红色鲱鱼)并且您使用了隐式限定列 UserID。根据上面引用的规则,由于同级没有UserID,所以会隐式使用外层查询的UserID。 QED.