Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 可以在SQL中解析键:值对吗_Sql Server_Split - Fatal编程技术网

Sql server 可以在SQL中解析键:值对吗

Sql server 可以在SQL中解析键:值对吗,sql-server,split,Sql Server,Split,我有一个数据库列(varchar),它保存以下格式的数据: 操作:下载文档|状态:1 |站点:250104 |参考:19014 |成员:12345 我知道我可以使用STRING_SPLIT来获取成对的key:value,但我正在尝试获取一个键和值表。我尝试过拆分的并集,但到目前为止只会出现错误 我试过了 ;WITH cte_pairs AS ( SELECT value FROM STRING_SPLIT(@activityValue, '|') ) , cte_keyvalu

我有一个数据库列(varchar),它保存以下格式的数据:

操作:下载文档|状态:1 |站点:250104 |参考:19014 |成员:12345

我知道我可以使用STRING_SPLIT来获取成对的
key:value
,但我正在尝试获取一个键和值表。我尝试过拆分的并集,但到目前为止只会出现错误


我试过了

        ;WITH cte_pairs AS
(
SELECT value
FROM STRING_SPLIT(@activityValue, '|')
)
, cte_keyvalues AS
(SELECT value
FROM STRING_SPLIT(cte_pairs.value,':')
)
SELECT * FROM cte_keyvalues

是的,这很简单

SELECT [key] = LEFT(s.value, ca.pos - 1),
       [value] = SUBSTRING(s.value, ca.pos + 1, 8000)
FROM STRING_SPLIT(@activityValue, '|') s
CROSS APPLY (VALUES(CHARINDEX(':', s.value))) ca(pos);

是的,这很简单

SELECT [key] = LEFT(s.value, ca.pos - 1),
       [value] = SUBSTRING(s.value, ca.pos + 1, 8000)
FROM STRING_SPLIT(@activityValue, '|') s
CROSS APPLY (VALUES(CHARINDEX(':', s.value))) ca(pos);

8000是从哪里来的?@Nick-只是一个大数字,希望比实际中可能存在的任何
值都要大。这样它就可以一直读取到字符串的末尾,而无需费心使用
LEN
来计算字符的确切数目。8000是从哪里来的?@Nick-这只是一个大数字,希望比实际中可能存在的任何
值都要大。这样它就可以一直读取到字符串的末尾,而无需费心使用
LEN
来计算确切的字符数