使用返回JSON的动态SQL时忽略数字列中的科学符号
下面的动态查询以科学记数法返回数字列的输出使用返回JSON的动态SQL时忽略数字列中的科学符号,json,sql-server,dynamic,dynamicquery,for-json,Json,Sql Server,Dynamic,Dynamicquery,For 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 JSO
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输出
表格输出
如上所述,tablar视图正确地返回AWP
值,JSON视图使用科学符号返回值如何在不使用Sc.符号的情况下获取JSONAWP
列。
请注意
- 它需要将数值保留为数值,而不将其转换为JSON结果中的字符串
- 无法更改单个列的格式,因为列是动态的
- 评论太长了,所以我将此作为答案发布。在关于如何将SQL Server数据类型转换为JSON类型的
FOR JSON
中,我只能找到这些解释。因此,作为一种可能的解决方法,您可以尝试使用系统目录视图中的信息将float
列转换为numeric
(我假设SELECT
是针对一个视图的)
可能
AWP
列是float
列。@PermittedColumnIDs
表中存储的信息是什么?仅列名称一种可能的方法是在为每个float
列动态生成SELECT
语句时,使用CONVERT(数值(x,y),Description)作为描述。文档中关于JSON如何将SQL Server数据类型转换为JSON类型的唯一部分是,并且没有关于此转换使用的格式的信息。如果动态选择的列的数据类型是VARCHAR怎么办?此函数是否也尝试将其转换为数字?否,只有float
列将被转换为数字。
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