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运算符,不会报错
总而言之,我想不通为什么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运算符,不会报错