SQL Server 2008 查询视图时出现错误4147,但执行视图内容时却没有

SQL Server 2008 Error 4147 when querying a view, but not when executing the content of the view

总而言之,我想不通为什么View上的Select会报错,而执行View的Select语句本身时却不会。

当我运行以下查询时:

SELECT * 
  FROM vAccountBalance

我收到以下错误:

消息 4147,级别 15,状态 1,过程 vAccountBalance,第 13 行 该查询使用非 ANSI 外连接运算符(“=”或“=”)。要在不修改的情况下运行此查询,请使用 ALTER DATABASE 的 SET COMPATIBILITY_LEVEL 选项将当前数据库的兼容级别设置为 80。强烈建议使用 ANSI 外连接运算符(LEFT OUTER JOIN、RIGHT OUTER JOIN)重写查询。在 SQL Server 的未来版本中,即使在向后兼容模式下,也将不支持非 ANSI 连接运算符。 消息 4413,级别 16,状态 1,第 2 行 由于绑定错误,无法使用视图或函数 'vAccountBalance'。

当我执行 vAccountBalance 的 Select 语句(如下)时,它执行时没有错误。 此外,下面的语句不包含错误和大多数解决方案所引用的非 ANSI 运算符(* = 或 = *)。兼容级别设置为 100。

SELECT T1.ACCOUNTCODE, 
COALESCE (T2.CreditTotal, 0) AS CreditTotal, 
COALESCE (T3.DebitTotal, 0) AS DebitTotal, 
COALESCE (T2.CreditTotal, 0) - COALESCE (T3.DebitTotal, 0) AS AccountBalance
FROM dbo.ACCOUNT AS T1         
LEFT OUTER JOIN dbo.vCreditTotals AS T2 ON T1.ACCOUNTCODE = T2.Account 
LEFT OUTER JOIN dbo.vDebitTotals AS T3 ON T1.ACCOUNTCODE = T3.Account

尝试在视图中执行 sp_refreshview 'vAccountBalance',然后 运行 SELECT。

此问题与用于查看视图内容的选项有关。

当使用"Design"(像我一样)查看View的语句时,非ANSI运算符(* =)会自动转换为LEFT OUTER JOIN格式。

使用"Script View as > Alter to > New Query Editor Window"查看View的语句时,显示非ANSI运算符(*=)。

执行视图时出错,因为视图确实包含非 ANSI 运算符。

使用"Design"打开View执行内容时,由于转换了Non-ANSI运算符,不会报错