Пропуск Scientifi c Нотация в столбцах Numeri c при работе с Dynami c SQL возвращается JSON - PullRequest
0 голосов
/ 05 мая 2020

Приведенный ниже запрос Dynami c возвращает выходные данные столбцов numeri c в нотации Scientifi c.

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

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

Table

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

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

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

1 Ответ

1 голос
/ 05 мая 2020

Это слишком долго для комментария, поэтому я отправляю это как ответ. Я могу найти только эти пояснения в документации о том, как FOR JSON преобразовывает SQL серверные типы данных в 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
...