Stringa divisa T-SQL basata sul delimitatore

Ho alcuni dati che vorrei dividere in base a un delimitatore che può o non può esistere.

Dati di esempio:

John/Smith Jane/Doe Steve Bob/Johnson 

Sto usando il seguente codice per suddividere questi dati in Nome e cognome:

 SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName FROM MyTable 

I risultati che vorrei:

 FirstName---LastName John--------Smith Jane--------Doe Steve-------NULL Bob---------Johnson 

Questo codice funziona bene finché tutte le righe hanno il delimitatore previsto, ma si verificano errori quando una riga non:

 "Invalid length parameter passed to the LEFT or SUBSTRING function." 

Come può una riscrittura di questo per funzionare correttamente?

Potrebbe essere questo ti aiuterà.

 SELECT SUBSTRING(myColumn, 1, CASE CHARINDEX('/', myColumn) WHEN 0 THEN LEN(myColumn) ELSE CHARINDEX('/', myColumn) - 1 END) AS FirstName ,SUBSTRING(myColumn, CASE CHARINDEX('/', myColumn) WHEN 0 THEN LEN(myColumn) + 1 ELSE CHARINDEX('/', myColumn) + 1 END, 1000) AS LastName FROM MyTable 
 SELEZIONA CASO 
         QUANDO CHARINDEX ('/', myColumn, 0) = 0
             ALLORA myColumn
         ELSE LEFT (myColumn, CHARINDEX ('/', myColumn, 0) -1)
         FINE COME FirstName
     ,ASTUCCIO 
         QUANDO CHARINDEX ('/', myColumn, 0) = 0
             POI ''
         ELSE RIGHT (myColumn, CHARINDEX ('/', REVERSE (myColumn), 0) -1)
         FINE COME LastName
 Da MyTable

Per coloro che cercano risposte su SQL Server 2016. Utilizzare la funzione String_Split

Per esempio:

 DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike' SELECT value FROM STRING_SPLIT(@tags, ',') WHERE RTRIM(value) <> ''; 

Riferimento: https://msdn.microsoft.com/en-nz/library/mt684588.aspx

Prova a filtrare le righe che contengono stringhe con il delimitatore e lavora su quelle solo come:

 SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName FROM MyTable WHERE CHARINDEX('/', myColumn) > 0 

O

 SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName FROM MyTable WHERE myColumn LIKE '%/%'