咨询:如何创建不包含隐藏graph_id列的SQL Server NODE图表视图
我之前也碰到过类似的情况,SQL Server的图形表(NODE/EDGE类型)自带的系统隐藏列确实偶尔会在视图里“偷偷冒出来”,下面给你一步步拆解解决办法:
先搞清楚问题根源
SQL Server为NODE表自动生成的graph_id_xxxxxx列是系统隐藏列(标记为is_hidden=1),正常情况下,当你明确指定SELECT [NAME]创建视图时,视图应该只包含NAME列。如果它出现在视图的列列表里,要么是元数据显示的小问题,要么是视图创建时的逻辑没限制住这些系统列。
分步解决
1. 先确认基表的列属性
先跑这条SQL,确认这个graph_id_xxxxxx列是不是标准的系统隐藏列:
SELECT name, is_hidden, is_system_column FROM sys.columns WHERE object_id = OBJECT_ID('[dbo].[FILE_NAME]');
如果结果里is_hidden=1且is_system_column=1,说明它是标准的系统隐藏列,接下来按下面的方法处理就行。
2. 用SCHEMABINDING创建视图(最稳妥的方案)
给视图加上WITH SCHEMABINDING选项,强制视图和基表的schema绑定,这样视图就只会严格包含你明确指定的列,不会自动带上系统隐藏列:
-- 先删掉旧视图(如果存在) DROP VIEW IF EXISTS FILE_VIEW1; GO -- 创建带SCHEMABINDING的视图 CREATE VIEW FILE_VIEW1 WITH SCHEMABINDING AS SELECT [NAME] FROM [dbo].[FILE_NAME]; GO
3. 验证视图的列
跑这条SQL确认视图的列列表:
SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('[FILE_VIEW1]');
现在应该只会看到NAME列了。如果还是能看到graph_id_xxxxxx,那可能是你用的SQL Server版本有小bug,试试升级到最新补丁,或者换个方式明确指定列的别名:
CREATE VIEW FILE_VIEW1 AS SELECT [NAME] AS [NAME] FROM [dbo].[FILE_NAME];
4. 特殊情况:只是工具显示问题
如果你在SSMS的视图设计器里看到这个列,但实际执行SELECT * FROM FILE_VIEW1时并没有返回它,那这只是SSMS的显示bug,不用管它——实际查询结果才是准确的。
额外小技巧:批量生成非隐藏列的SELECT语句
如果你的基表有很多非隐藏列,不想手动写,可以用这条SQL生成自动排除隐藏列的SELECT语句:
SELECT STRING_AGG(QUOTENAME(name), ', ') FROM sys.columns WHERE object_id = OBJECT_ID('[dbo].[FILE_NAME]') AND is_hidden = 0;
把生成的结果复制到视图的SELECT子句里就行,省心又准确。
内容的提问来源于stack exchange,提问作者Daniel Lederman

