2016-02-18 4 views
0

У меня есть следующий кодСмарт CONVERT поплавок VARCHAR в T-SQL

DECLARE @m FLOAT=213456789.55 
DECLARE @sql VARCHAR(MAX)='INSERT INTO Test VALUES('+CONVERT(VARCHAR,@m,1)+')' 
EXEC(@sql) 

но результат 213456790 вместо 213456789.55

Когда я пытаюсь написать CONVERT(VARCHAR,213456789.55,1) она возвращает 213456789.55 не 213456790

Как это решить?

редактирует

Декларирование @m в десятичной как следующий DECLARE @m DECIMAL(18,2)=213456789.55 решить эту проблему, но я хочу знать, если есть другое решение для использования поплавка. Спасибо

+0

'CONVERT (VARCHAR (100), @m)' должны это сделать. –

+0

пробовал без успеха! Это ничего не меняет – Bellash

ответ

0

Вы можете использовать STR вместо CONVERT. STR позволяет указать число десятичных знаков справа от десятичной точки.

DECLARE @m FLOAT=213456789.55; 
SELECT 
@m AS [Float] 
,CONVERT(VARCHAR(100),@m,0) AS Convert0 
,CONVERT(VARCHAR(100),@m,1) AS Convert1 
,CONVERT(VARCHAR(100),@m,2) AS Convert2 
,LTRIM(STR(@m, 20, 2)) AS [Str] 

Результат (SQL Server 2008)

+--------------+--------------+----------------+------------------------+--------------+ 
| Float  | Convert0 | Convert1 |  Convert2  |  Str  | 
+--------------+--------------+----------------+------------------------+--------------+ 
| 213456789.55 | 2.13457e+008 | 2.1345679e+008 | 2.134567895500000e+008 | 213456789.55 | 
+--------------+--------------+----------------+------------------------+--------------+ 

CONVERT всегда использует научные обозначения для float типов.

+0

Спасибо, что это сработало! За исключением случаев, когда '@m = 12456354213456789.55;' – Bellash

+1

[float] (https://msdn.microsoft.com/en-AU/library/ms173773.aspx) имеет точность 15 цифр. Итак, когда вы присваиваете '12456354213456789.55' переменной' float', значение округляется. Если вам нужно более 15 цифр точности, вы должны использовать 'decimal'. –

0

попробовать это:

DECLARE @m FLOAT=213456789.55 
DECLARE @sql VARCHAR(MAX)='INSERT INTO Test VALUES('+CONVERT(VARCHAR,CAST(@m AS MONEY),1)+')' 
EXEC(@sql) 
+0

Благодарим вас за ответ, время и усилия. Но пока это может работать, не стоит менять тип 'float' на' money'. Цель заключалась не в изменении типа данных (кроме варчара) – Bellash