вы можете достичь этого с помощью string_split, если ваша версия sql поддерживает это следующим образом
with data
as (select '008300000;#61,008300000;#62,008300000;#63' as gi,'1' as pos union all
select '008300000;#61,008300000;#62,008300000;#63' as gi,'2' as pos union all
select '008300000;#61,008300000;#62,008300000;#63' as gi,'3' as pos
)
,cte_d
as(
select *
,row_number() over(partition by pos order by pos) as rn
from data d
cross apply string_split(d.gi,',') x
)
select *
from cte_d
where rn=pos
В более старых версиях вы можете использовать эту
with data
as (select '008300000;#61,008300000;#62,008300000;#63' as gi,'1' as pos union all
select '008300000;#61,008300000;#62,008300000;#63' as gi,'2' as pos union all
select '008300000;#61,008300000;#62,008300000;#63' as gi,'3' as pos
)
,cte_d
as(
SELECT a.gi
,a.pos
,split.a.value('.', 'VARCHAR(100)') AS split_val
,row_number() over(partition by pos order by pos) as rn
FROM (SELECT pos
,CAST ('<M>' + REPLACE(gi, ',', '</M><M>') + '</M>' AS XML) AS col
,gi
FROM data
) a
CROSS APPLY col.nodes ('/M') AS split(a)
)
select *
from cte_d
where rn=pos
+-------------------------------------------+-----+---------------+----+
| gi | pos | value | rn |
+-------------------------------------------+-----+---------------+----+
| 008300000;#61,008300000;#62,008300000;#63 | 1 | 008300000;#61 | 1 |
| 008300000;#61,008300000;#62,008300000;#63 | 2 | 008300000;#62 | 2 |
| 008300000;#61,008300000;#62,008300000;#63 | 3 | 008300000;#63 | 3 |
+-------------------------------------------+-----+---------------+----+
ссылку dbfiddle https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=1f753ad7c97255351efc704ebdd966c3