Пропуск научной нотации в числовых столбцах при работе с динамическим SQL, возвращающим JSON

Приведенный ниже динамический запрос возвращает выходные данные числовых столбцов в научной нотации.

DECLARE @Cols VARCHAR(MAX) = (SELECT STUFF((
SELECT ',' +'['+ Description + ']' FROM @PermittedColumnIDs

DECLARE @Query NVARCHAR(MAX) = 'SELECT TOP 1000 '+ @Cols +' FROM ' + (SELECT ViewName FROM
@DynamicQueryProps) + ' FOR JSON AUTO';
EXECUTE sp_executesql @Query

Вывод JSON

JSON

Табличный вывод

Таблица

Как упоминалось выше, табличное представление возвращает значение AWP правильно, а представление JSON возвращает его с экспоненциальной записью. Как получить столбец JSON AWP без Sc. обозначение.

Обратите внимание, что

  • Необходимо сохранить числовое значение как числовое, не преобразовывая его в строку в результате JSON.
  • Невозможно изменить формат отдельных столбцов, поскольку столбцы являются динамическими.

person Harsha W    schedule 05.05.2020    source источник
comment
Вероятно, AWPcolumn — это float столбец. Какая информация хранится в таблице @PermittedColumnIDs?   -  person Zhorov    schedule 05.05.2020
comment
Просто имя столбца   -  person Harsha W    schedule 05.05.2020
comment
Один из возможных подходов — использовать CONVERT(numeric(x, y), Description) AS Description при динамическом создании оператора SELECT для каждого столбца float. Единственная часть документации о том, как FOR JSON преобразовывает типы данных SQL Server в типы JSON, — это здесь и нет информации о формат, который используется для этого преобразования.   -  person Zhorov    schedule 05.05.2020
comment
Что делать, если тип данных динамически выбранного столбца — VARCHAR? Разве эта функция не пытается преобразовать его также в числовое?   -  person Harsha W    schedule 05.05.2020
comment
Нет, только столбцы float будут преобразованы в числовые.   -  person Zhorov    schedule 05.05.2020
comment
DECLARE @Cols VARCHAR(MAX) = (SELECT STUFF(( SELECT ',' +'['+ s.Description + '] AS [' + REPLACE(s.Description, ' ', '') + ']' FROM @PermittedColumnIDs s ORDER BY s.ID FOR XML PATH('')),1, 1, '')) Не могли бы вы показать мне, как применить приведенный выше сегмент кода здесь   -  person Harsha W    schedule 05.05.2020


Ответы (1)


Это слишком долго для комментария, поэтому я публикую это как ответ. Я могу найти только эти объяснения в документация о том, как FOR JSON преобразует типы данных SQL Server в типы JSON. Таким образом, в качестве возможного обходного пути вы можете попытаться преобразовать столбцы float в столбцы numeric, используя информацию из представлений системного каталога (я предполагаю, что SELECT противоречит представлению).

DECLARE @cols varchar(MAX) = STUFF(
    (
    SELECT 
        ', ' +
        CASE 
           WHEN t.[name] = 'float' THEN 'CONVERT(numeric(10, 2), [' + p.[description] + ']) AS [' + p.[description] + N'] '
           ELSE p.[description] 
        END
    FROM sys.columns c
    JOIN sys.views v ON c.object_id = v.object_id
    JOIN sys.schemas s ON v.schema_id = s.schema_id
    JOIN sys.types t ON c.system_type_id = t.system_type_id
    JOIN @PermittedColumnIDs p ON p.[description] = c.[name]
    WHERE v.[name] = (SELECT ViewName FROM @DynamicQueryProps) AND s.[name] = 'dbo'
    FOR XML PATH(''), TYPE
    ).value('.', 'varchar(max)'), 1, 1, ''
)

DECLARE @query nvarchar(max) 
SET @query = 
   N' SELECT TOP 1000 '+ @Cols +
   N' FROM [' + (SELECT ViewName FROM @DynamicQueryProps) + ']' +
   N' FOR JSON AUTO';

EXECUTE sp_executesql @query
person Zhorov    schedule 05.05.2020