Изменение типа данных с NVARCHAR на DECIMAL не работает - PullRequest
0 голосов
/ 03 июля 2018

У меня есть расчет, из которого я получаю ('/') или ('*'). Это сохраняется в переменной "@op". Проблема заключалась в том, что я не смог выполнить некоторые вычисления из-за проблем с приведением, поэтому я преобразовал значения вместе со своим значением из "@op". Результат этого имеет тип данных NVARCHAR.

Проблема в том, что я не получаю правильный результат ?! Возможно литье не работает ...

И вообще я не смог сгенерировать десятичное значение из переменной "@Factor", которая имеет тип данных NVARCHAR. Здесь вы можете увидеть команду приведения, которую я пробовал:

SET @Factor = (SELECT(CAST(@Factor as Decimal(18,6))))

Поскольку это не сработало, может быть, из-за точки, я попытался получить деталь до точки и после нее, отлить ее другим способом, но, к сожалению, получился неправильный результат ...

Я использую SQL Server Managing Studio v17.7

DECLARE @Factor NVARCHAR(20)
DECLARE @op NVARCHAR(20)
DECLARE @num3 FLOAT

SET @num3 = 1.0
SET @op = (SELECT dbo.CalculateFactor1())

SET @Factor = 'SELECT ' + CAST(@num3 AS nvarchar(20)) + @op + CAST(RAND() AS nvarchar(20))

EXEC sp_executesql @Factor -- random factor

DECLARE @test0 NVARCHAR(20)
DECLARE @test1 NVARCHAR(20)
DECLARE @test2 NVARCHAR(20)
DECLARE @test3 NVARCHAR(20)
DECLARE @test4 NVARCHAR(20)

SET @test1 = '0.123456'

SET @test2 = LEFT(@test1, CHARINDEX('.', @test1) - 1) -- gives me the part in front of the comma
SELECT @test2

SET @test3 = SUBSTRING(@test1,(CHARINDEX('.',@test1)+1),7) -- gives me the part after the comma 
SELECT @test3

SET @test4 = LEFT(@test1, CHARINDEX('.', @test1) - 1) + '.' + SUBSTRING(@test1,(CHARINDEX('.',@test1)+1),6) -- gives me the complete number
SELECT @test4 

SET @test0 = (SELECT(CAST(LEFT(@test1, CHARINDEX('.', @test1) - 1) + '.'  + SUBSTRING(@test1,(CHARINDEX('.',@test1)+1),6) AS DECIMAL(18,6)))) 
SELECT @test0

DECLARE @solution DECIMAL
SET @solution = @test0 * 200.0
SELECT @solution 

-- result is 20
-- expected result 24.6912 

1 Ответ

0 голосов
/ 03 июля 2018

Должен быть явным

DECLARE @solution DECIMAL(18,6)
SET @solution = cast(@test0 as decimal(18,6)) * 200.0
SELECT @solution
...