Here's a function that does exactly what you want:
CREATE FUNCTION [dbo].[itvfFindPos]
(
@strInput VARCHAR(8000)
,@delimiter VARCHAR(5)
)
RETURNS TABLE WITH SCHEMABINDING
AS
RETURN
(
WITH E1(N) AS (
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
),
E2(N) AS (SELECT 1 FROM E1 a, E1 b
),
E4(N) AS (SELECT 1 FROM E2 a, E2 b
),
cteTally(N) AS (SELECT 0 UNION ALL
SELECT TOP (DATALENGTH(ISNULL(@strInput,1))) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
),
findchar (posnum,pos)
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY t.N) AS posnum
,CHARINDEX(@delimiter,@strInput,t.N) AS pos
FROM
cteTally t
WHERE
(SUBSTRING(@strInput,t.N,1) = @delimiter)
)
SELECT
posnum
,pos
FROM
findchar
WHERE
pos > 0
)
GO
Now create some sample data to test the function:
;WITH
SampleData(Name)
AS
(
SELECT 'sas programmer' UNION ALL
SELECT 'mms programmer' UNION ALL
SELECT 'my name is ravikumar' UNION ALL
SELECT 'i am sas programmer' UNION ALL
SELECT 'i am good in sas'
)
SELECT
s.Name
,t.posnum
,t.pos
FROM
SampleData AS s
CROSS APPLY
dbo.itvfFindPos(s.Name,'m') AS t
ORDER BY
Name
,posnum
,pos
Returns
Nameposnumpos
i am good in sas14
i am sas programmer14
i am sas programmer216
i am sas programmer317
mms programmer11
mms programmer22
mms programmer311
mms programmer412
my name is ravikumar11
my name is ravikumar26
my name is ravikumar318
sas programmer111
sas programmer212