【发布时间】:2021-10-14 19:36:43
【问题描述】:
我在一个用逗号分隔的单列中有一个包含多个 IP 地址的表,我正在使用以下查询,并且在选择中使用它时效果很好,但是当我尝试创建视图时它不起作用,它给我错误
无效的对象名称'string_split'。
string_split 可以在视图中实际使用吗?我可以使用 SP,但它确实有助于它的视图,因为我需要使用其他视图和 UNION ALL
SELECT
distinct [ColumnA]
,[ColumnB]
,cs.value as IPs
FROM [table] as A
cross apply string_split(
replace(
replace(
replace(
replace([value], '-', ',')
, ';', ',')
, '_', ',')
, ' ', ',')
, ',')cs
where A.[value] <> ''
and cs.value like '%.%.%.%' --and cs.value like '%host%'
order by 3
数据通常也有很多垃圾文本,比如系统或其他词,所以我用替换过滤掉它们,所以string_split 也将它拆分,然后我使用 where 来删除所有不是一个IP
数据示例
| ColumnA | ColumnB | IPs |
|---|---|---|
| SomeText | MoreText | 10.10.10.10,10.10.10.11,10.10.10.12 |
作为查询使用时的结果示例
| ColumnA | ColumnB | IPs |
|---|---|---|
| SomeText | MoreText | 10.10.10.10 |
| SomeText | MoreText | 10.10.10.11 |
| SomeText | MoreText | 10.10.10.12 |
【问题讨论】:
-
仅供参考,不推荐按序号列号排序作为最佳做法。使用列名。
-
提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
-
你的 SQL 有错误,你的内部替换应该引用列 [IPs]
-
您绝对可以在视图中使用
string_split,请参阅dbfiddl。如果我是你,我会将替换功能移到单独的cross apply中,这样你就可以单独调试它 - 而不是在一个语句中完成所有操作。 -
您的数据库需要在兼容级别 130
标签: sql sql-server tsql split view