Given this data:
CREATE TABLE dbo.RandomData(StringValue varchar(128));
INSERT dbo.RandomData(StringValue) VALUES
('ABC-33-Ha8o89-00'),
('ABC-232-Ui7380-000');
A quick and dirty way, given that you state that there are always three dashes:
SELECT StringValue,
Parsed = PARSENAME(REPLACE(StringValue,'-','.'), 2)
-- parsename starts right
FROM dbo.RandomData;
On 2016+, you can use OPENJSON
:
SELECT r.StringValue, Parsed = j.value
FROM dbo.RandomData AS r
CROSS APPLY OPENJSON ('["'
+ REPLACE(r.StringValue, '-', '","') + '"]') AS j
WHERE [key] = 2; -- keys are 0-based
And on any version, you can use an ordered split function (there are dozens and dozens of examples out there), here's one I grabbed from this article and this earlier answer:
CREATE FUNCTION dbo.SplitOrdered
(
@list nvarchar(max),
@delim nvarchar(10)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
WITH w(n) AS (SELECT 0 FROM (VALUES (0),(0),(0),(0)) w(n)),
k(n) AS (SELECT 0 FROM w a, w b),
r(n) AS (SELECT 0 FROM k a, k b, k c, k d, k e, k f, k g, k h),
p(n) AS (SELECT TOP (COALESCE(LEN(@list), 0))
ROW_NUMBER() OVER (ORDER BY @@SPID) -1 FROM r),
spots(p) AS
(
SELECT n FROM p
WHERE (SUBSTRING(@list, n, LEN(@delim + 'x') - 1) LIKE @delim OR n = 0)
),
parts(p,val) AS
(
SELECT p, SUBSTRING(@list, p + LEN(@delim + 'x') - 1,
LEAD(p, 1, 2147483647) OVER (ORDER BY p) - p - LEN(@delim))
FROM spots AS s
)
SELECT listpos = ROW_NUMBER() OVER (ORDER BY p),
Item = LTRIM(RTRIM(val))
FROM parts
);
Then the query is:
SELECT r.StringValue, Parsed = s.Item
FROM dbo.RandomData AS r
CROSS APPLY dbo.SplitOrdered(r.StringValue, '-') AS s
WHERE s.listpos = 3; -- listpos is 1-based
All three examples in this db<>fiddle.