问题描述
有没有人有脚本可以提取列中保存的数据以将服务器名称拆分为他们自己的列?
| ID| Servers
|:-:|---------------------------------------------------------------------------------
| 1 | {"Name":"sql-Vlfflk43E"}
| 2 | {"Name":"sql-VgflkglkdA"},{"Name":"sql-VCkfkjgitrE"},{"Name":"sql-;bv;b;b"},{"Name":"sql-kkkbdddb"}
| 3 | {"Name":"sql-VgkgkgA"},{"Name":"sql-VfkgkjygtbB"},{"Name":"sql-lglg"}
| 4 | {"Name":"sql-VotoevB"},{"Name":"sql-VCfkjfkjrtrE"},{"Name":"sql-lglkgl"}
| 5 | {"Name":"sql-VblgltotA"},{"Name":"sql-VCfkfkgE"},{"Name":"sql-lkgkjgkg"}
| 6 | {"Name":"sql-VCggkgkg"}
那么 ID 1 & 2 会变成下面这样吗?我知道 char
和 patindex
可以帮助我努力理解它。
| ID| Text | Server1 | Server2 | Server3 | Server4
| 1 | {"Name":"sql-Vlfflk43E"} |sql-Vlfflk43E |null |null | null
| 2 | {"Name":"sql-VgflkglkdA"},{"Name":"sql-kkkbvb;b"},{"Name":"sql-kkkbdddb"}|sql-VgflkglkdA|sql-VCkfkjgitrE|sql-kkkbvb | sql-kkkbdddb
解决方法
您可以将存储的数据转换为有效的 JSON 数组并使用 JSON_VALUE()
进行解析:
SELECT
ID,Server1 = JSON_VALUE(CONCAT('[',Servers,']'),'$[0].Name'),Server2 = JSON_VALUE(CONCAT('[','$[1].Name'),Server3 = JSON_VALUE(CONCAT('[','$[2].Name'),Server4 = JSON_VALUE(CONCAT('[','$[3].Name')
FROM (VALUES
(1,'{"Name":"SQL-Vlfflk43E"}'),(2,'{"Name":"SQL-VgflkglkdA"},{"Name":"SQL-VCkfkjgitrE"},{"Name":"SQL-;bv;b;b"},{"Name":"SQL-kkkbdddb"}'),(3,'{"Name":"SQL-VgkgkgA"},{"Name":"SQL-VfkgkjygtbB"},{"Name":"SQL-lglg"}'),(4,'{"Name":"SQL-VotoevB"},{"Name":"SQL-VCfkjfkjrtrE"},{"Name":"SQL-lglkgl"}'),(5,'{"Name":"SQL-VblgltotA"},{"Name":"SQL-VCfkfkgE"},{"Name":"SQL-lkgkjgkg"}'),(6,'{"Name":"SQL-VCggkgkg"}')
) v (ID,Servers)
结果:
ID Server1 Server2 Server3 Server4
-------------------------------------------------------------
1 SQL-Vlfflk43E
2 SQL-VgflkglkdA SQL-VCkfkjgitrE SQL-;bv;b;b SQL-kkkbdddb
3 SQL-VgkgkgA SQL-VfkgkjygtbB SQL-lglg
4 SQL-VotoevB SQL-VCfkjfkjrtrE SQL-lglkgl
5 SQL-VblgltotA SQL-VCfkfkgE SQL-lkgkjgkg
6 SQL-VCggkgkg