Couper une partie de la valeur dans SQL Server en utilisant la sous-string?

J'ai ces données dans ma colonne:

32-HC-100-10001-G03P2-N-1-1001 

Le problème est que ma valeur n'a pas de longueur fixe. Ce que je dois faire est de split cette valeur en 2 colonnes 32-HC-100-10001-G03P2-N et 1 – les numbers après la dernière - ne sont pas importants

Un autre exemple

 4-G-100-10029-F23S-S-2-1001 

devrait être divisé en 4-G-100-10029-F23S-S et 2 . J'ai utilisé SUBSTRING([Line No#], 0, 21) mais à cause de la longueur, cela n'a pas fonctionné.

Essayez de cette façon

 declare @str varchar(100)=reverse('4-G-100-10029-F23S-S-2-1001') select reverse(subssortingng(@str,charindex('-',@str)+1,len(@str))) as first_col, left(subssortingng(@str,charindex('-',@str)+1,len(@str)),charindex('-',subssortingng(@str,charindex('-',@str)+1,len(@str)))-1) as second_col 

Peut ne pas être la méthode la plus courte mais devrait faire le travail

Note: je n'ai pas durci le code ici

Tant que la dernière partie (1-1001,2-2002 …) aura le même nombre de valeurs, cela fonctionnera.

 declare @ssortingng varchar(max) set @ssortingng='32-HC-100-10001-G03P2-N-1-1001' select replace(@ssortingng, right(@ssortingng,7),''),subssortingng(right(@ssortingng,6),1,1) 

Sortie:

 32-HC-100-10001-G03P2-N 1 

Lorsque vous effectuez des opérations de string complexes dans SQL Server, une méthode utilise outer apply pour simplifier les calculs:

 select t.col, s2.firstpart, s2.secondpart from t outer apply (select left(col, len(col) - charindex('-', reverse(col)) as s1 -- remove the last number ) s1 outer apply (select left(s1, len(s1) - charindex('-', reverse(s1)) as firstpart, right(s1, charindex('-', reverse(s1)) -1) as secondpart ) s2; 

Je trouve les calculs plus faciles à build, à suivre et à déboguer.

Vous pouvez essayer ceci:

 DECLARE @ssortingng nvarchar(max) = '32-HC-100-10001-G03P2-N-1-1001' SELECT REVERSE(STUFF(SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng))+1,LEN(@ssortingng)),1,CHARINDEX('-',SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng))+1,LEN(@ssortingng))),'')), REVERSE(LEFT(SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng))+1,LEN(@ssortingng)),CHARINDEX('-',SUBSTRING(REVERSE(@ssortingng),CHARINDEX('-',REVERSE(@ssortingng)),LEN(@ssortingng))))) 

Sortie:

 32-HC-100-10001-G03P2-N 1 

S'il s'agit toujours d'une 7ème partie, vous pouvez utiliser XML:

 DECLARE @ssortingng nvarchar(max) = '32-HC-100-10001-G03P2-N-1-1001', @xml xml SELECT @xml = CAST('<d>'+REPLACE(@ssortingng,'-','</d><d>') +'</d>' as xml) SELECT tvvalue('/d[1]','nvarchar(10)') + '-' + tvvalue('/d[2]','nvarchar(10)') + '-' + tvvalue('/d[3]','nvarchar(10)') + '-' + tvvalue('/d[4]','nvarchar(10)') + '-' + tvvalue('/d[5]','nvarchar(10)') + '-' + tvvalue('/d[6]','nvarchar(10)'), tvvalue('/d[7]','nvarchar(10)') FROM @xml.nodes('/') as t(v) 

Sortie:

 32-HC-100-10001-G03P2-N 1