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 记录假日年,然后 JOIN
到 HolidayYearUserBalances
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.
我不是 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 记录假日年,然后 JOIN
到 HolidayYearUserBalances
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.