Вы можете извлечь строку между первой и второй обратной косой чертой как
with t(col1) as
(
select 'test\abc\123\' union all
select 'test\abc\' union all
select 'test\abc\12\' union all
select 'test\abcdefg\1234\'
)
select SUBSTRING(
col1,
CHARINDEX('\',col1)+1,
CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
CHARINDEX('\',col1)-1
)
from t;
Result String
-------------
abc
abc
abc
abcdefg
Демо
Редактировать (против вероятности использования значений col1 с менее чем двумя обратными слешами) :
select SUBSTRING(
col1,
CHARINDEX('\',col1)+1,
CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
CHARINDEX('\',col1)-1
)
from t
where len(col1) - len(replace(col1,'\','')) >= 2
, чтобы полностью отфильтровать их.
или
select case when len(col1) - len(replace(col1,'\','')) >= 2 then
SUBSTRING(
col1,
CHARINDEX('\',col1)+1,
CHARINDEX('\',col1,CHARINDEX('\',col1)+1)-
CHARINDEX('\',col1)-1
)
else
col1
end
as "Result String"
from t
отобразить все строки, оставить те же, что испортило правило.