SQL Server String разделяется с использованием перекрестного применения, возвращая ошибку - PullRequest
0 голосов
/ 25 июня 2018

Я использую следующее в операторе выбора, чтобы разбить строку на; ограничитель Ошибки запроса, если в поле фактически нет данных или нет разделителя, как я могу сделать здесь контроль ошибок

select ParsedData.* 
from Table1
cross apply ( select str = field + ';;' ) f1
cross apply ( select p1 = charindex( ';', str ) ) ap1
cross apply ( select p2 = charindex( ';', str, p1 + 1 ) ) ap2
cross apply ( select p3 = CHARINDEX(';', str, p2 + 1 )) ap3
cross apply ( select p4 = CHARINDEX(';', str, p3 + 1 )) ap4
cross apply ( select p5 = CHARINDEX(';', str, p4 + 1 )) ap5
cross apply ( select p6 = CHARINDEX(';', str, p5 + 1 )) ap6
cross apply ( select A = substring( str, 1, p1-1 )         
                    ,B = substring( str, p1+1, p2-p1-1 )
                    ,C = SUBSTRING( str, p2+1 , p3-p2-1)
                    ,D = SUBSTRING( str, p3+1 , p4-p3-1)
                    ,E = SUBSTRING( str, p4+1 , p5-p4-1)
                    ,F = SUBSTRING( str, p5+1 , p6-p5-1)
          ) ParsedData

Ошибка возвращена - неверный параметр длины передан в функцию LEFT или SUBSTRING.

Input
Полная строка
яблоко; манго; вишня; варенье; торт

выход
A B C D E

Яблочно-манго с вишневым вареньем

Спасибо

1 Ответ

0 голосов
/ 25 июня 2018

Вы можете попробовать добавить предложение where, чтобы исключить эти данные.Однако, в зависимости от плана запроса, выражения могут быть оценены в любом случае (до применения where)

select ParsedData.* 
from Table1
cross apply ( select str = field + ';;' ) f1
cross apply ( select p1 = charindex( ';', str ) ) ap1
cross apply ( select p2 = charindex( ';', str, p1 + 1 ) ) ap2
cross apply ( select p3 = CHARINDEX(';', str, p2 + 1 )) ap3
cross apply ( select p4 = CHARINDEX(';', str, p3 + 1 )) ap4
cross apply ( select p5 = CHARINDEX(';', str, p4 + 1 )) ap5
cross apply ( select p6 = CHARINDEX(';', str, p5 + 1 )) ap6
cross apply ( select A = substring( str, 1, p1-1 )         
                    ,B = substring( str, p1+1, p2-p1-1 )
                    ,C = SUBSTRING( str, p2+1 , p3-p2-1)
                    ,D = SUBSTRING( str, p3+1 , p4-p3-1)
                    ,E = SUBSTRING( str, p4+1 , p5-p4-1)
                    ,F = SUBSTRING( str, p5+1 , p6-p5-1)
          ) ParsedData
 where str like '%;%;%;%;%'

Однако имейте в виду, что в SQL 2016 для этого можно использовать string_split.

https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

...