使用 Dynamic SQL 返回 JSON 时省略数字列中的科学记数法

Omitting Scientific Notation in Numeric columns when working with Dynamic SQL returning JSON

下面的动态查询 returns 科学记数法中数字列的输出。

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输出

表格输出

如上所述,表格视图 returns AWP 值正确 JSON 用科学记数法查看 returns 它。 如何在没有 Sc 的情况下获得 JSON AWP 列。表示法。

请注意

评论太长了,所以我 post 以此作为回答。我只能在 documentation 中找到这些关于 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