带有错误提示的SQL Server视图能否正常运行?视图设计报错咨询
关于SQL Server视图设计器报错及视图可用性的解答
你创建的视图代码如下:
CREATE VIEW uvw_AllProductInOrder AS SELECT DISTINCT I.OrderId, O.OrderNumber, O.OrderDate, STUFF(( SELECT ',' + CAST(I2.ProductId AS varchar) FROM OrderItem AS I2 WHERE I2.OrderId = I.OrderId FOR XML PATH ('')),1,1,'') AS ProductList, SUM(I.Quantity * I.UnitPrice) OVER (PARTITION BY OrderId) AS TotalAmount FROM OrderItem AS I INNER JOIN [Order] AS O ON I.OrderId = O.Id GO
咱们先解决第一个问题:为什么在设计视图中打开这个视图会报错?
你的视图代码本身是完全合法、可以正常运行的,但SQL Server的可视化设计器(也就是你说的“设计视图”)对一些复杂的SQL语法支持有限,比如你用到的:
STUFF()搭配FOR XML PATH('')的字符串拼接写法SUM() OVER(PARTITION BY OrderId)这种窗口函数DISTINCT和窗口函数一起使用的组合逻辑
这些写法会让设计器的内置解析器无法正确解析视图的结构,所以才会弹出Error in WHERE ...的错误提示,但这绝对不代表你的视图代码有问题。
解决这个问题的小建议:
- 放弃使用可视化设计器打开或修改这个视图,直接在SSMS的查询编辑器中查看和编辑视图的SQL代码,这是最可靠的方式。
- 如果一定要用设计器,你可能需要重构视图逻辑(比如把字符串拼接的部分抽成自定义函数),但说实话完全没必要,因为你的视图本身功能是正常的。
接下来回答第二个问题:存在错误的SQL Server视图还能正常工作吗?
这个得分情况讨论:
- 有语法错误的视图:如果视图的SQL本身存在语法错误,那么在执行
CREATE VIEW的时候就会直接失败,根本无法创建和保存到数据库中。 - 设计器报错但SQL本身合法的视图:就像你遇到的情况,视图的SQL是有效的,查询它的时候能正常返回结果,只是设计器搞不懂它的结构而已,这类视图完全可以正常工作。
- 依赖对象变更导致的无效视图:如果视图依赖的表、列等对象被修改(比如删掉了视图用到的
OrderNumber列),视图会被标记为“无效”状态,但执行的时候SQL Server会尝试自动重新编译视图,如果重新编译成功(比如修改不影响视图逻辑),视图依然能正常使用;如果重新编译失败(比如依赖的列彻底不存在了),才会抛出执行错误。
内容的提问来源于stack exchange,提问作者Percy
相关产品推荐
相关产品推荐

