Ответ 1
Кастинг или преобразование в VARCHAR(MAX)
или что-то еще не работало для меня с использованием больших целых чисел (в полях с плавающей запятой), таких как 167382981, которые всегда выходили "1.67383e + 008".
Что работало STR()
.
конвертировать float в varchar на SQL-сервере без научных обозначений и декомпрессии тримминга.
для Ex:
i имеет значение float 1000.2324422, тогда оно будет преобразовано в varchar как таковое 1000.2324422.
было бы любое количество десятичных значений. Значение флагов приходит случайно.
Кастинг или преобразование в VARCHAR(MAX)
или что-то еще не работало для меня с использованием больших целых чисел (в полях с плавающей запятой), таких как 167382981, которые всегда выходили "1.67383e + 008".
Что работало STR()
.
Ни для меня не str()
или cast(float as nvarchar(18))
.
Что в итоге работало, преобразовывалось в int, а затем преобразовывалось в nvarchar следующим образом:
convert(nvarchar(18),convert(bigint,float))
Функция STR работает хорошо. Я вернулась назад после выполнения некоторых расчетов и должна была перейти на VARCHAR, но также получала научную нотацию. Я сделал это преобразование после всех вычетов
ltrim(rtrim(str(someField)))
Попробуйте CAST(CAST(@value AS bigint) AS varchar)
Это не относится к этому конкретному случаю из-за десятичных знаков, но может помочь людям, которые google заголовок. Целочисленные поля преобразуются в переменные в varchars, но плавающие сменяются на научную нотацию. Очень быстрый способ быстро изменить float, если у вас нет десятичных знаков, заключается в том, чтобы сначала изменить поле на целое число и затем изменить его на varchar.
Это работает CONVERT(VARCHAR(100), CONVERT(DECIMAL(30, 15), fieldname))
Попробуй это:
SELECT REPLACE(RTRIM(REPLACE(REPLACE(RTRIM(REPLACE(CAST(CAST(YOUR_FLOAT_COLUMN_NAME AS DECIMAL(18,9)) AS VARCHAR(20)),'0',' ')),' ','0'),'.',' ')),' ','.') FROM YOUR_TABLE_NAME
Вам нужно будет проверить свои данные ОЧЕНЬ хорошо. Это может стать беспорядочным. Вот пример результатов, просто умножив значение на 10. Запустите это, чтобы посмотреть, что произойдет. В моем блоке SQL Server 2017 в третьем запросе я получаю кучу *********. Если вы CAST как BIGINT, он должен работать каждый раз. Но если вы этого не сделаете и не испытаете достаточно данных, вы можете столкнуться с проблемами позже, поэтому не задумывайтесь над тем, что он будет работать на всех ваших данных, если вы не проверите максимальное ожидаемое значение.
Declare @Floater AS FLOAT =100000003.141592653
SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ),
CONVERT(VARCHAR(100),ROUND(@Floater,0)),
STR(@Floater)
SET @Floater [email protected] *10
SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ),
CONVERT(VARCHAR(100),ROUND(@Floater,0)),
STR(@Floater)
SET @Floater [email protected] *100
SELECT CAST(ROUND(@Floater,0) AS VARCHAR(30) ),
CONVERT(VARCHAR(100),ROUND(@Floater,0)),
STR(@Floater)
Ниже приведен пример, где мы можем преобразовать значение с плавающей запятой без каких-либо научных обозначений.
DECLARE @Floater AS FLOAT = 100000003.141592653
SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
,STR(@Floater)
,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
SET @Floater = @Floater * 10
SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
,STR(@Floater)
,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
SET @Floater = @Floater * 100
SELECT CAST(ROUND(@Floater, 0) AS VARCHAR(30))
,CONVERT(VARCHAR(100), ROUND(@Floater, 0))
,STR(@Floater)
,LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
SELECT LEFT(FORMAT(@Floater, ''), CHARINDEX('.', FORMAT(@Floater, '')) - 1)
,FORMAT(@Floater, '')
В приведенном выше примере мы видим, что функция форматирования полезна для нас. Функция FORMAT() всегда возвращает nvarchar.
У меня есть другое решение, так как функция STR() приведет к пробелам, поэтому я использую функцию FORMAT() в качестве следующего примера:
SELECT ':' + STR(1000.2324422), ':' + FORMAT(1000.2324422,'##.#######'), ':' + FORMAT(1000.2324422,'##')
Результат приведенного выше кода будет:
: 1000 :1000.2324422 :1000
http://bytes.com/topic/sql-server/answers/80603-formatting-float-varchar-but-not-scientific-notation
он помогает до 8 байт фигуры. В диапазоне (-922,337,203,685,477.5808 до 922,337,203,685,477.5807)
Это работает:
предполагать
dbo.AsDesignedBites.XN1E1 = 4016519.564'
Для следующей строки:
'POLYGON(('+STR(dbo.AsDesignedBites.XN1E1, 11, 3)+'...