AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 198838
Accepted
Zach Smith
Zach Smith
Asked: 2018-02-27 08:47:50 +0800 CST2018-02-27 08:47:50 +0800 CST 2018-02-27 08:47:50 +0800 CST

SQL Server 2012 中“FOR JSON”的替代方案?

  • 772

在 SQL Server 2016 中,我可以按照文档Format Query Results as JSON with FOR JSON (SQL Server)JSON中的描述输出查询结果

SELECT * 
FROM x 
FOR JSON PATH

但我发现这在 SQL Server 2012 中不受支持。

JSONSQL Server 2012中是否有将表格数据转换为数据的内置方法?

为了使这种交叉兼容,我希望能够for json path在 SQL Server 2012 中使用。

sql-server sql-server-2012
  • 4 4 个回答
  • 32726 Views

4 个回答

  • Voted
  1. Brent Ozar
    2018-02-27T09:08:43+08:002018-02-27T09:08:43+08:00

    不,JSON 支持是 SQL Server 2016 中的新增功能。

    如果要将数据转换为 JSON,您有以下几种选择:

    • 像获取任何其他查询结果一样获取行,并在应用层(如 C#、Java 等)中对其进行转换
    • 在存储过程或函数中构建 T-SQL 逻辑以自己将其转换为 JSON(但请记住,您将无法像 2016 年一样使用“FOR JSON PATH”)
    • 构建 CLR 逻辑来做到这一点(同样,不会与“FOR JSON PATH”兼容)
    • 6
  2. Best Answer
    Zach Smith
    2018-07-24T23:51:00+08:002018-07-24T23:51:00+08:00

    在 SQL Server 2012 中,您可以使用FOR XML. 就我而言,这是一个可行的替代方案JSON,因为我只是将字符串传递给浏览器。

    • 4
  3. 2 revsuser126897
    2018-06-13T01:49:28+08:002018-06-13T01:49:28+08:00

    社区维基回答:

    您可以使用它,但更改您的JSON. 这会将所有结果存储为一项:

    $server = 'Test'
    $mainquery = sqlcmd -E -S $server -Q "set nocount on; select name,database_id,compatibility_level from sys.databases" -m 10 -h-1 
    $mainquery | convertto-json #-Depth 3
    

    或者,您可以构建自己的函数,如Phil Factor通过 TSQL 从 SQL Server 查询中生成 JSON 文档中所述。

    • 1
  4. C.P. Soni
    2020-08-04T15:49:20+08:002020-08-04T15:49:20+08:00

    从 SQL Server 2012 构建 JSON 数据的工作解决方案

        DECLARE @TableName NVARCHAR(50)
        DECLARE @TempTableColumns TABLE (
            [Object_Id] NVARCHAR(100),
            [TableName] NVARCHAR(100),
            [ColumnName] NVARCHAR(100),
            [ColumnSequence] INT,
            [Type] NVARCHAR(100)
        )
    
        INSERT INTO @TempTableColumns ([Object_Id],[TableName],[ColumnName],[ColumnSequence],[Type])
        SELECT 
            [T].[OBJECT_ID] [Object_Id]
            , [T].[Name]
            , [C].[Name] [ColumnName]
            , [C].[column_id] AS [ColumnSequence]
            , UPPER(CASE 
                WHEN 
                    UPPER([ST].[Name]) = 'VARCHAR' OR UPPER([ST].[Name]) = 'NVARCHAR' THEN [ST].[Name] + '(' +  CASE WHEN CONVERT(VARCHAR,[C].[Max_Length]) = -1 THEN 'MAX' ELSE CONVERT(VARCHAR,[C].[Max_Length]) END + ')' 
                ELSE [ST].[Name] END) [Type]
            FROM SYS.COLUMNS [C] 
            INNER JOIN SYS.TYPES [ST] ON [C].[System_Type_Id] = [St].[System_Type_Id]
            INNER JOIN SYS.TABLES [T] ON [C].[OBJECT_ID] = [T].[OBJECT_ID] 
            WHERE [ST].[Name] <> 'sysname'
        ORDER BY [T].[Name], [C].[column_id]
        
        SELECT 
            [T1].[TableName], 
            REPLACE('SELECT ROW_NUMBER() OVER (ORDER BY ' + (SELECT T3.ColumnName FROM @TempTableColumns T3 WHERE T3.TableName = T1.TableName AND T3.ColumnSequence = 1) + ' ASC) SequenceNumber, ''{' + 
            STUFF(( 
                SELECT '"' + T2.ColumnName + '": '' + CASE WHEN ' + T2.ColumnName + ' IS NULL THEN ''NULL'' ELSE ''"'' + CONVERT(NVARCHAR(MAX), ' + T2.ColumnName + ') + ''"'' END  + '','
                    FROM @TempTableColumns AS T2 WHERE T1.TableName = T2.TableName
                    FOR XML PATH('')
            ),1, 0,'')  + '}'' DataResults FROM ['+ T1.TableName +'] WITH (NOLOCK)', ',}','}') AS [Query]
        
        FROM @TempTableColumns [T1]
        WHERE T1.TableName >= @TableName OR @TableName = ''
        GROUP BY [T1].[TableName]
    
    

    查询的输出将返回 Select 语句,如下所示:

    SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) SequenceNumber, '{"ID": ' + CASE WHEN ID IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), ID) + '"' END  + ',"DatabaseName": ' + CASE WHEN DatabaseName IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), DatabaseName) + '"' END  + ',"SchemaName": ' + CASE WHEN SchemaName IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), SchemaName) + '"' END  + ',"ObjectName": ' + CASE WHEN ObjectName IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), ObjectName) + '"' END  + ',"ObjectType": ' + CASE WHEN ObjectType IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), ObjectType) + '"' END  + ',"IndexName": ' + CASE WHEN IndexName IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), IndexName) + '"' END  + ',"IndexType": ' + CASE WHEN IndexType IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), IndexType) + '"' END  + ',"StatisticsName": ' + CASE WHEN StatisticsName IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), StatisticsName) + '"' END  + ',"PartitionNumber": ' + CASE WHEN PartitionNumber IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), PartitionNumber) + '"' END  + ',"ExtendedInfo": ' + CASE WHEN ExtendedInfo IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), ExtendedInfo) + '"' END  + ',"Command": ' + CASE WHEN Command IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), Command) + '"' END  + ',"CommandType": ' + CASE WHEN CommandType IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), CommandType) + '"' END  + ',"StartTime": ' + CASE WHEN StartTime IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), StartTime) + '"' END  + ',"EndTime": ' + CASE WHEN EndTime IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), EndTime) + '"' END  + ',"ErrorNumber": ' + CASE WHEN ErrorNumber IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), ErrorNumber) + '"' END  + ',"ErrorMessage": ' + CASE WHEN ErrorMessage IS NULL THEN 'NULL' ELSE '"' + CONVERT(NVARCHAR(MAX), ErrorMessage) + '"' END  + '}' DataResults FROM [CommandLog] WITH (NOLOCK)
    
    

    当您运行从上面返回的单个查询时。会给你如下输出:

    
    {"ID": "79143","DatabaseName": "msdb","SchemaName": NULL,"ObjectName": NULL,"ObjectType": NULL,"IndexName": NULL,"IndexType": NULL,"StatisticsName": NULL,"PartitionNumber": NULL,"ExtendedInfo": NULL,"Command": "DECLARE @ReturnCode int EXECUTE @ReturnCode = dbo.xp_create_subdir N'G:\Backup\AWS19WVSQL072\msdb\FULL' IF @ReturnCode <> 0 RAISERROR('Error creating directory.', 16, 1)","CommandType": "xp_create_subdir","StartTime": "Jul 18 2020  1:00AM","EndTime": "Jul 18 2020  1:00AM","ErrorNumber": "0","ErrorMessage": NULL}
    
    {"ID": "79144","DatabaseName": "msdb","SchemaName": NULL,"ObjectName": NULL,"ObjectType": NULL,"IndexName": NULL,"IndexType": NULL,"StatisticsName": NULL,"PartitionNumber": NULL,"ExtendedInfo": NULL,"Command": "BACKUP DATABASE [msdb] TO DISK = N'G:\Backup\AWS19WVSQL072\msdb\FULL\AWS19WVSQL072_msdb_FULL_20200718_010056.bak' WITH CHECKSUM, NO_COMPRESSION","CommandType": "BACKUP_DATABASE","StartTime": "Jul 18 2020  1:00AM","EndTime": "Jul 18 2020  1:01AM","ErrorNumber": "0","ErrorMessage": NULL}
    
    
    • -1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve