SPLIT_String is not recognized function name in SQL 2022

Naomi Nosonovsky 8,771 Reputation points
2025-10-19T01:22:48.07+00:00

Good day,

In SQL Server 2022 split_sting function shows with red underline like it doesn't exist. This statement

SELECT v.value   FROM #FirstResult  
	 CROSS APPLY SPLIT_STRING(Prov_Last_Name,'') AS v

returns this error: Msg 208, Level 16, State 1, Procedure im_automation.accent_changes, Line 157 [Batch Start Line 2] Invalid object name 'SPLIT_STRING'.

SQL Server | SQL Server Transact-SQL
0 comments No comments
{count} votes

2 answers

Sort by: Most helpful
  1. Marcin Policht 63,730 Reputation points MVP Volunteer Moderator
    2025-10-19T03:46:03.87+00:00

    The function name is STRING_SPLIT, not SPLIT_STRING, so your query should be:

    SELECT v.value
    FROM #FirstResult
    CROSS APPLY STRING_SPLIT(Prov_Last_Name, '') AS v;
    

    However, this will still fail because the separator argument cannot be empty ('') — SQL Server requires a non-empty delimiter. For example, to split a comma-separated list, you'd use:

    SELECT v.value
    FROM #FirstResult
    CROSS APPLY STRING_SPLIT(Prov_Last_Name, ',') AS v;
    

    If your goal is to split a string into individual characters, STRING_SPLIT won't work — it doesn't support splitting by an empty delimiter. You can do that using a numbers (tally) table or a small trick like:

    SELECT SUBSTRING(Prov_Last_Name, n, 1) AS value
    FROM #FirstResult
    JOIN (
        SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
        FROM sys.objects
    ) AS numbers
    ON n <= LEN(Prov_Last_Name);
    

    If the above response helps answer your question, remember to "Accept Answer" so that others in the community facing similar issues can easily find the solution. Your contribution is highly appreciated.

    hth

    Marcin

    1 person found this answer helpful.

  2. Naomi Nosonovsky 8,771 Reputation points
    2025-10-19T17:27:19.4266667+00:00

    Just code covers all cases:

    ;WITH cteGenerations AS ( SELECT DISTINCT v.value,  f.record_sequence, f.Prov_Last_Name, 
    	TRIM(SUBSTRING(f.Prov_Last_Name, NULLIF(CHARINDEX(' ', f.Prov_last_Name),0) + 1, LEN(f.Prov_Last_Name))) AS Generation
         FROM #FirstResult f
         CROSS APPLY STRING_SPLIT(f.Prov_Last_Name, ' ') AS v
    	 WHERE f.Prov_Group = 'N' AND f.Prov_Last_Name <> '' AND f.Prov_Last_Name LIKE '% %' 
          AND -- (v.value =  'First' OR v.value = 'JR' OR v.value = 'I' OR v.value = 'II' OR v.value = 'III' OR  v.value = 'V' OR v.value = 'IV')
    	         (f.Prov_Last_Name LIKE '% JR' OR f.Prov_Last_Name LIKE '% I' OR f.Prov_Last_Name LIKE '% II' OR f.Prov_Last_Name LIKE '% III'
    			  OR f.Prov_Last_Name LIKE '% V' OR f.Prov_Last_Name LIKE '% I V' AND f.Prov_Last_Name LIKE '% I I I' OR f.Prov_Last_Name LIKE '% SR')
    			  AND (
            v.value IN ('Jr', 'Sr', 'II', 'III', 'IV', 'V', 'VI')
            OR v.value LIKE 'Jr.%' 
            OR v.value LIKE 'Sr.%'
        )
    	  
    	),
    	cteGenerations2 AS (SELECT  f.value,  f.record_sequence, f.Prov_Last_Name, 
    	
    	           CASE WHEN f.Generation IN ('JR', 'SR', '|', 'II', 'III', 'I V', 'V', 'V I', 'I I I', 'I I') THEN f.Generation ELSE TRIM(SUBSTRING(f.Generation, NULLIF(CHARINDEX(' ', f.Generation),0) + 1, LEN(f.Generation) )) end
    			   AS Generation
    			   FROM cteGenerations f)
       UPDATE f 
       SET f.Generation = f2.Generation
       FROM #FirstResult f INNER JOIN cteGenerations2 f2
       ON f.record_sequence = f2.record_sequence;
    
    
    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.