使用 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
列。表示法。
请注意
- 它需要在 JSON 结果中将数值保留为数字而不将其转换为字符串。
- 无法更改单个列的格式,因为列是动态的。
评论太长了,所以我 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
下面的动态查询 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
列。表示法。
请注意
- 它需要在 JSON 结果中将数值保留为数字而不将其转换为字符串。
- 无法更改单个列的格式,因为列是动态的。
评论太长了,所以我 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