Changez une string = '1 1/4' à '1.2500'

declare @Dimension = '1 1/4' varchar(20)

Je veux changer Dimension = '1 1/4' à Dimension = '1.2500' . Je ne sais pas comment split un varchar en 2 varchar et changer une partie puis recombiner puis dans un seul varchar

 UPDATE VF_CasINV_Cost SET @Dimension = CASE when (@Dimension like '%1/4') then (left(@Dimension, charindex(' ', @Dimension, 1) - 1) * (subssortingng(@Dimension, 1 + charindex(' ', @Dimension, 1), len(@Dimension))) end where @Dimension like '%1/4' 

ce qui serait génial de savoir comment parsingr la fraction et la recaler en décimal à la volée

 declare @x varchar(100) select @x = '15 3/165' select convert(int, subssortingng(@x, 1, charindex(' ', @x))) + ( convert(decimal(12,4), subssortingng(@x, charindex(' ', @x) + 1, charindex('/', @x) - charindex(' ', @x) - 1)) / convert(decimal(12,4), subssortingng(@x, charindex('/', @x) + 1, len(@x) - charindex('/', @x))) ) 

La charge utile m'a battu mais une façon est de;

 declare @Dimension varchar(20) = '1 1/8' declare @sql nvarchar(512) = 'set @out=' + replace(@Dimension, ' ',' + ') + '.00' declare @result decimal(9,4) execute sp_executesql @sql, N'@value varchar(30), @out decimal(9,4) output', @value=@Dimension, @out=@result output select @result 

isoler la fraction avec la sous-string et le charindexing, puis exécuter un select.

 set @ssortingngquery = SELECT "SELECT "+subssortingng(@Dimension,1+charindex(' ',@Dimension,1),len(@Dimension); execute sp_executesql @ssortingngquery 

Cela devrait gérer et fractionner après un espace.

En fait, en y réfléchissant – pour faire toute l'équation, il suffit de replace l'espace par un signe + et de l'exécuter par sp_executesql, cela devrait (je l'ai déjà testé à ce point) convertir 1 1/4 à 1 + 1/4 et le moteur mathématique standard fera la division avant l'addition donc il finira comme 1.25.

Ce script peut gérer plus de variations de dimension (x dans la table)

 declare @t table(x varchar(20)) insert @t values('1 1/2') insert @t values('2') insert @t values('2/3') insert @t values('22 1/3') select coalesce(cast(case when isnumeric(n1)=1 then n1 else 0 end + n2 / n3 as real), n1) from ( select case when isnumeric(x) = 1 then x else left(x, patindex('%_ %', x)) end n1, cast(stuff(stuff(x, patindex('%/%', x), charindex('/',reverse(x)), ''), 1,charindex(' ',x),'') as real) n2, case when patindex('%_/%', reverse(x)) = 0 then null else cast(right(x, patindex('%_/%', reverse(x))) as real) end n3 from @t ) a