потерять меньше чисел при создании строки из таблицы SQL Server - PullRequest
0 голосов
/ 03 сентября 2011

У меня есть таблица с двойными числами вроде 0.681672875510799

так, например, фиктивная таблица:

a1      a2
-------------------------
1      0.681672875510799
NULL    1
NULL    NULL
NULL    NULL
NULL    NULL
NULL    NULL

Когда я делаю

DECLARE @CommaString nvarchar(max)
SET @CommaString = ''
SELECT @CommaString = 
STUFF(
(SELECT  ',' + CAST([col] AS VARCHAR) FROM (
 SELECT [a1] AS col FROM [ta] UNION ALL 
 SELECT [a2] AS col FROM [ta] 
) alldata FOR XML PATH('')  )  ,   1  ,   1  ,  '' )
PRINT @CommaString;

Это печатает:

1,0.681673,1

поэтому я теряю несколько десятичных знаков, которые также важны. Как мне изменить код, чтобы получить 1,0.681672875510799,1 вместо 1,0.681673,1?

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

В вашем внутреннем запросе:

SELECT  ',' + CAST([col] AS VARCHAR) 
FROM (
  SELECT [a1] AS col FROM [ta] 
  UNION ALL 
  SELECT CAST([a2] AS DECIMAL(18,15)) AS col FROM [ta]

Преобразование FLOAT в DECIMAL работает для меня (SQL Server 2008 R2). Возможно, вам придется настроить (18,15) для работы с вашими данными.

Только что заметил еще одну вещь, которая работает (и, вероятно, более последовательно):

SELECT  ',' + CONVERT(varchar(max), col, 128)
FROM (
  SELECT [a1] AS col FROM [ta] 
  UNION ALL 
  SELECT [a2] AS col FROM [ta]
1 голос
/ 03 сентября 2011

Ваша проблема в том, что вы преобразуете в varchar без указания размера, вам нужно сделать CAST([col] AS VARCHAR(max)

DECLARE @CommaString nvarchar(max)
SET @CommaString = ''
SELECT @CommaString = 
STUFF(
(SELECT  ',' + cast(CAST( [col] as decimal(22,19)) as varchar(30)) FROM (
 SELECT [a1] AS col FROM [#ta] UNION ALL 
 SELECT [a2] AS col FROM [#ta] 
) alldata FOR XML PATH('')  )  ,   1  ,   1  ,  '' )
PRINT @CommaString;

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

РЕДАКТИРОВАТЬ: Включая определение моей таблицы:

create table #ta 
(
   a1 int,
  a2 float
)

РЕДАКТИРОВАТЬ: снова изменил определение таблицы с десятичного на плавающее для столбца b и добавил двойное приведение в моем запросе.

Теперь он производит: 1.0000000000000000000,1.0000000000000000000,0.6816728755107990500

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...