String_Split函数能否在视图中使用?创建视图报对象名无效如何解决?
核心问题解答
string_split本身完全支持在视图中使用,你遇到的Invalid Object name 'string_split'报错基本是以下两个原因导致的:
- 数据库兼容级别不足:
string_split是SQL Server 2016版本新增的系统函数,要求对应数据库的兼容级别至少为130,如果兼容级别低于130,系统会无法识别该函数。 - 视图定义存在语法问题:你当前的查询带了
ORDER BY子句,直接封装为视图本身就会触发语法报错,只是优先抛出了函数找不到的错误。
第一步:确认并调整数据库兼容级别
执行以下查询查看当前数据库的兼容级别:
SELECT name, compatibility_level FROM sys.databases WHERE name = '你的数据库名';
如果查询结果的compatibility_level低于130,执行以下语句调整(需数据库管理员权限):
ALTER DATABASE 你的数据库名 SET COMPATIBILITY_LEVEL = 130;
如果是更老的SQL Server版本(2014及以下)不支持兼容级别130,也可以手动创建自定义字符串拆分函数替代系统的string_split,文末会给出示例。
第二步:修改查询语句后创建视图
首先要去掉视图里的ORDER BY子句,视图作为虚拟表本身不存储排序规则,排序逻辑放在查询视图的时候添加即可。同时可以主动指定sys架构调用string_split避免架构识别问题,修改后的视图创建语句如下:
CREATE VIEW vw_split_ips AS SELECT DISTINCT [ColumnA] ,[ColumnB] ,cs.value as IPs FROM [table] as A CROSS APPLY sys.string_split( REPLACE( REPLACE( REPLACE( REPLACE([value], '-', ',') , ';', ',') , '_', ',') , ' ', ',') , ',') cs WHERE A.[value] <> '' AND cs.value LIKE '%.%.%.%';
创建完成后你可以按需求排序查询结果:
SELECT * FROM vw_split_ips ORDER BY IPs;
低版本SQL Server兼容方案
如果你的SQL Server版本不支持系统的string_split,可以先创建以下自定义拆分函数:
CREATE FUNCTION dbo.Custom_String_Split ( @String NVARCHAR(MAX), @Delimiter CHAR(1) ) RETURNS @Result TABLE (Value NVARCHAR(MAX)) AS BEGIN DECLARE @Position INT WHILE CHARINDEX(@Delimiter, @String) > 0 BEGIN SET @Position = CHARINDEX(@Delimiter, @String) INSERT INTO @Result (Value) SELECT SUBSTRING(@String, 1, @Position - 1) SET @String = SUBSTRING(@String, @Position + 1, LEN(@String) - @Position) END INSERT INTO @Result (Value) SELECT @String RETURN END
然后把视图里的sys.string_split替换为dbo.Custom_String_Split即可正常使用。
内容的提问来源于stack exchange,提问作者SGP
相关产品推荐
相关产品推荐

