首页 > 解决方案 > 在 SQL 中替换和拆分字符串并从值创建变量

问题描述

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

"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 函数。

有什么方法可以创建一个带有名称的变量(如您在 PowerShell 输出名称列中所见)和保存在那里的值?

我对 SQL 很陌生,我阅读过REPLACE()SPLIT()无法真正理解它。特别是在动态创建变量时。

我在 MS SQL Server 2016 上

标签: sqlsql-servertsqlsql-server-2016

解决方案


如果您的 sql-server 版本是 2016,您可以尝试将STRING_SPLITE函数与CROSS APPLY.

我会编写一个子查询STRING_SPLIT来拆分;结果集。

使用指定的分隔符拆分字符表达式。

然后编写另一个子查询查询以根据上层结果集拆分:by 。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

结果

|            Name | Value |
|-----------------|-------|
| Anz Längsteiler |     0 |
|  Anz Querteiler |     0 |
|          BoxTyp |     M |
|   Führungslänge |   500 |
|         Gewicht |    40 |

推荐阅读