我在数据库字段中有一个这样的字符串:
"Anz Längsteiler":0;"Anz Querteiler":0;"BoxTyp":"M";"Führungslänge":500;"Gewicht":40;
在PowerShell中,我可以这样做:
$Hash = @{}
($BoxDS -replace '"','') -split ';' | foreach {
$Val = $_ -split ":" ; $Hash[$Val[0]] = $Val[1]
}
获得这样的输出以供进一步使用:
PS C:\Windows\System32\WindowsPowerShell\v1.0> $hash
Name Value
---- -----
BoxTyp M
Anz Längsteiler 0
Anz Querteiler 0
Führungslänge 500
Gewicht 40
现在,我想摆脱PowerShell脚本并创建一个SQL函数。
有什么办法可以使用Name(如在PowerShell输出名称列中看到的)创建一个变量,并在其中保存值?
我对SQL还是很陌生,我读过REPLACE()
和SPLIT()
的书,但是我无法真正理解它。尤其是动态创建变量时。
我正在使用MS SQL Server 2016
答案 0 :(得分:2)
如果您的sql-server版本是2016,则可以尝试将STRING_SPLITE函数与CROSS APPLY
一起使用。
我会用STRING_SPLIT
编写子查询,以将;
拆分为结果集。
使用指定的分隔符分隔字符表达式。
然后编写另一个子查询查询,以根据较高的结果集将:
除以CROSS APPLY
。
查询1 :
SELECT MAX(CASE WHEN t2.rn = 1 THEN t2.value end) Name,
MAX(CASE WHEN t2.rn = 2 THEN t2.value end) Value
FROM (
SELECT value as val
FROM STRING_SPLIT(Replace('"Anz Längsteiler":0;"Anz Querteiler":0;"BoxTyp":"M";"Führungslänge":500;"Gewicht":40;','"',''),';')
) t1 CROSS APPLY (
SELECT *,ROW_NUMBER() OVER(PARTITION BY t1.val order by t1.val) rn
FROM STRING_SPLIT(t1.val,':')
) t2
where t1.val<>''
GROUP BY t1.val
Results :
| Name | Value |
|-----------------|-------|
| Anz Längsteiler | 0 |
| Anz Querteiler | 0 |
| BoxTyp | M |
| Führungslänge | 500 |
| Gewicht | 40 |