Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用返回JSON的动态SQL时忽略数字列中的科学符号_Json_Sql Server_Dynamic_Dynamicquery_For Json - Fatal编程技术网

使用返回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.符号的情况下获取JSON
AWP
列。

请注意

  • 它需要将数值保留为数值,而不将其转换为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