SQL中的REPLACE和SPLIT字符串,并根据值创建变量

时间:2018-09-03 08:33:29

标签: sql sql-server tsql sql-server-2016

我在数据库字段中有一个这样的字符串:

"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

1 个答案:

答案 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 |