【问题标题】:SQL Server 2016 Parse JSON into TableSQL Server 2016 将 JSON 解析为表
【发布时间】:2018-02-16 21:45:13
【问题描述】:

我正在尝试使用 SQL Server 2016 中的 JSON 解析将 API 的 JSON 输出转换为 SQL Server 表。但是,我很难让它工作。我已经用尽了我所有的搜索努力。

JSON 输出非常简单。

    [{"Jobs":[{"Agricultural":false,"AlternateTitle":null,"DateInJob":"/Date(1454997600000)/","DirectLabor":false,"EffectiveDate":"/Date(-62135575200000)/","EmployeeIdentifier":{"EmployeeNumber":"000001","CompanyCode":"60639"},"EmployeeType":"REG","FullOrPartTime":"F","HourlyOrSalaried":"S","JobCode":"HRCOORD","JobGroup":null,"LocalUnion":null,"NationalUnion":null,"OrgLevel1":null,"OrgLevel2":null,"OrgLevel3":null,"OrgLevel4":null,"PayFrequency":"B","PayGroup":"60639","PayScaleCode":null,"Project":null,"Promotion":false,"ReasonCode":"100","ScheduledHours":80,"Seasonal":false,"SelfServiceProperties":null,"ShiftCode":"Z","ShiftGroup":"Z","StepNo":null,"Supervisor":null,"TimeClock":null,"Transfer":false,"YouthTraining":false}],"CompanyCode":"60639","EmployeeNumber":"000001","FirstName":"George","LastName":"TestEmployee"},{"Jobs":[{"Agricultural":false,"AlternateTitle":"Client Care Representative","DateInJob":"/Date(1497592800000)/","DirectLabor":false,"EffectiveDate":"/Date(-62135575200000)/","EmployeeIdentifier":{"EmployeeNumber":"003613","CompanyCode":"60637"},"EmployeeType":"TES","FullOrPartTime":"F","HourlyOrSalaried":"H","JobCode":"CCREP","JobGroup":null,"LocalUnion":null,"NationalUnion":null,"OrgLevel1":"000","OrgLevel2":"001","OrgLevel3":null,"OrgLevel4":null,"PayFrequency":"B","PayGroup":"60637","PayScaleCode":null,"Project":"STAFF","Promotion":false,"ReasonCode":"Z","ScheduledHours":80,"Seasonal":false,"SelfServiceProperties":null,"ShiftCode":"Z","ShiftGroup":"Z","StepNo":null,"Supervisor":{"EmployeeNumber":"003639","CompanyCode":"60637","ExtensionData":{}},"TimeClock":null,"Transfer":false,"YouthTraining":false}],"CompanyCode":"60637","EmployeeNumber":"003613","FirstName":"George","LastName":"TestEmployee"}]

我已使用此 SQL 代码将 JSON 数据提取到 SQL 中。

    Declare @JSON nvarchar(max) 
    SELECT @JSON = BulkColumn-- Replace(Replace(BulkColumn,'',''),'','')
    FROM OPENROWSET (BULK 'C:\JSON\JobService.json', SINGLE_CLOB) as j

    Select *
    from OPENJSON(@JSON, N'$')
    WITH (
    LastName nvarchar(100) N'$.LastName'
    ,FirstName nvarchar(100) N'$.FirstName'
    ,ScheduledHours INT N'$.Jobs.ScheduledHours')

我遇到的问题是获取更深层的嵌套数据。 LastName 和 FirstName 很好,但我无法在“Jobs”对象或更深的内部得到任何东西,我不知道为什么。任何帮助将不胜感激。

【问题讨论】:

    标签: json sql-server tsql sql-server-2016


    【解决方案1】:

    您可以使用 APPLY 再次调用 OPENJSON,如下所示:

    DECLARE @JSON NVARCHAR(MAX)=' [{"Jobs":[{"Agricultural":false,"AlternateTitle":null,"DateInJob":"/Date(1454997600000)/","DirectLabor":false,"EffectiveDate":"/Date(-62135575200000)/","EmployeeIdentifier":{"EmployeeNumber":"000001","CompanyCode":"60639"},"EmployeeType":"REG","FullOrPartTime":"F","HourlyOrSalaried":"S","JobCode":"HRCOORD","JobGroup":null,"LocalUnion":null,"NationalUnion":null,"OrgLevel1":null,"OrgLevel2":null,"OrgLevel3":null,"OrgLevel4":null,"PayFrequency":"B","PayGroup":"60639","PayScaleCode":null,"Project":null,"Promotion":false,"ReasonCode":"100","ScheduledHours":80,"Seasonal":false,"SelfServiceProperties":null,"ShiftCode":"Z","ShiftGroup":"Z","StepNo":null,"Supervisor":null,"TimeClock":null,"Transfer":false,"YouthTraining":false}],"CompanyCode":"60639","EmployeeNumber":"000001","FirstName":"George","LastName":"TestEmployee"},{"Jobs":[{"Agricultural":false,"AlternateTitle":"Client Care Representative","DateInJob":"/Date(1497592800000)/","DirectLabor":false,"EffectiveDate":"/Date(-62135575200000)/","EmployeeIdentifier":{"EmployeeNumber":"003613","CompanyCode":"60637"},"EmployeeType":"TES","FullOrPartTime":"F","HourlyOrSalaried":"H","JobCode":"CCREP","JobGroup":null,"LocalUnion":null,"NationalUnion":null,"OrgLevel1":"000","OrgLevel2":"001","OrgLevel3":null,"OrgLevel4":null,"PayFrequency":"B","PayGroup":"60637","PayScaleCode":null,"Project":"STAFF","Promotion":false,"ReasonCode":"Z","ScheduledHours":80,"Seasonal":false,"SelfServiceProperties":null,"ShiftCode":"Z","ShiftGroup":"Z","StepNo":null,"Supervisor":{"EmployeeNumber":"003639","CompanyCode":"60637","ExtensionData":{}},"TimeClock":null,"Transfer":false,"YouthTraining":false}],"CompanyCode":"60637","EmployeeNumber":"003613","FirstName":"George","LastName":"TestEmployee"}]'
    
    SELECT * FROM OPENJSON(@JSON)
    WITH (
        LastName nvarchar(100) N'$.LastName',
        FirstName nvarchar(100) N'$.FirstName',
        Jobs NVARCHAR(MAX) AS JSON
    ) j1
    OUTER APPLY (
        SELECT * FROM OPENJSON(j1.Jobs)
        WITH (
            ScheduledHours INT '$.ScheduledHours'
        )
    ) x
    

    【讨论】:

    • 我不知道为什么我从来没有想过。非常感谢,你真的帮助了我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多