为何OBJECT_ID()对其他对象有效,对视图却返回NULL?
解决OBJECT_ID获取带特殊字符视图ID返回NULL的问题
问题原因
你的视图名称包含**连字符(-)和点(.)**这类SQL Server特殊字符,直接传入OBJECT_ID函数时,函数会错误解析对象名(比如把点当成对象层级的分隔符),导致无法匹配到实际存在的视图,最终返回NULL。
解决方法
1. 使用方括号包裹对象名
用[]将完整视图名包裹,强制OBJECT_ID函数识别整个字符串为对象名:
-- 直接获取视图ID SELECT OBJECT_ID('[vw202004-divvy-tripdata.csv]'); -- 验证视图存在性的查询 SELECT TOP 1 1 FROM sys.views WHERE object_id = OBJECT_ID('[vw202004-divvy-tripdata.csv]'); -- 修改你的列表查询,批量获取ID SELECT name , type , object_id , [id] = OBJECT_ID('[' + name + ']', type) FROM sys.views;
如果需要指定数据库和架构,格式为:
SELECT OBJECT_ID('[YourDatabase].[YourSchema].[vw202004-divvy-tripdata.csv]');
2. 使用双引号包裹对象名(需开启QUOTED_IDENTIFIER)
如果你的会话开启了QUOTED_IDENTIFIER设置(默认开启),也可以用双引号包裹对象名:
SELECT OBJECT_ID("vw202004-divvy-tripdata.csv");
额外建议
后续创建数据库对象时,尽量避免在名称中使用连字符、点这类特殊字符,改用下划线(_)替代,也不要添加.csv这类文件后缀,从根源减少对象名解析问题。
内容的提问来源于stack exchange,提问作者Xanadu
相关产品推荐
相关产品推荐

