ЗАМЕНИТЬ и РАЗДЕЛИТЬ строку в SQL и создать переменные из значений - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть такая строка в поле базы данных:

"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

1 Ответ

0 голосов
/ 03 сентября 2018

Если ваша версия sql-сервера 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

Результаты

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