Преобразование типа данных с плавающей запятой в SQL Server в плоский файл - PullRequest
0 голосов
/ 22 мая 2018

У меня динамический SQL-запрос, который создает SP.Затем пакет служб SSIS загружает данные непосредственно из этих SP в простые файлы.В случае значений с плавающей точкой в ​​таблицах мы загружаем данные из SP в плоские файлы.Мы хотим, чтобы значения с плавающей запятой были точными в плоском файле.Нам не нужны лишние нули, неправильные значения.Мы используем следующую функцию преобразования sql, чтобы сохранить значения без изменений, но для таких значений, как 8023545654, эта функция преобразования обрезает значения.enter image description here Это для SQL Server 2008

SQL Server 2008

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Наилучший из возможных способов преобразования значения с плавающей запятой в то, что значения не усекаются, может быть

Select CONVERT(DECIMAL(18,7),columnname),128)[columnname] From TableName 

Это помогло мне сохранить большинство значений с плавающей запятой так же, как они были при вставке их втекстовый файл.

Предложения приветствуются

0 голосов
/ 22 мая 2018

Попробуйте?

DECLARE @tempforAnshul TABLE (id INT, new FLOAT);
INSERT INTO @tempforAnshul SELECT 1, 45.67;
INSERT INTO @tempforAnshul SELECT 2, 45.675;
INSERT INTO @tempforAnshul SELECT 3, 123.45;
INSERT INTO @tempforAnshul SELECT 4, 345.34;
INSERT INTO @tempforAnshul SELECT 5, 8023545654;
SELECT id, FORMAT(new, 'G') FROM @tempforAnshul;

Дает вам следующие результаты:

id  (No column name)
1   45.67
2   45.675
3   123.45
4   345.34
5   8023545654

Вероятно, также стоит отметить, что FORMAT возвращает либо NULL, либо NVARCHAR, что, по-видимому, является тем, что выхочу?Тем не менее, вы не можете контролировать длину NVARCHAR, поэтому вам, возможно, нужно быть немного осторожнее?

... и затем я перечитал ваш вопрос и увидел, что вы используете SQL Server 2008.Ну, это боль, так как FORMAT не пришел до 2012 года, но этот хак сработает:

WITH x AS (
    SELECT id, REVERSE(CONVERT(NVARCHAR(50), CONVERT(DECIMAL(30,8), new))) AS val FROM @tempforAnshul),
y AS (
    SELECT id, REVERSE(SUBSTRING(val, PATINDEX('%[^0]%', val), 100)) AS val FROM x)
SELECT
    id,
    CASE 
        WHEN RIGHT(val, 1) = '.' THEN LEFT(val, LEN(val)-1)
        ELSE val
    END AS val
FROM
    y;
...