Sql server 如何在SQL Server中存储、筛选和检索JSON数据

Sql server 如何在SQL Server中存储、筛选和检索JSON数据,sql-server,json,asp.net-mvc,mongodb,Sql Server,Json,Asp.net Mvc,Mongodb,我有JSON格式的数据。您可以检查以下示例: [ { "firstName": John, "lastName": Smith, "cars": [ { "id": 0, "name": "BMW" }, { "id": 1, "name": "Mercedes" }, { "id": 2, "name": "Audi" }

我有JSON格式的数据。您可以检查以下示例:

[
{
"firstName": John,
"lastName": Smith,
"cars": [
      {
        "id": 0,
        "name": "BMW"
      },
      {
        "id": 1,
        "name": "Mercedes"
      },
      {
        "id": 2,
        "name": "Audi"
      }
    ]
}
{
"firstName": Adam
"lastName": Sheen,
"cars": [
      {
        "id": 0,
        "name": "Ferrari"
      },
      {
        "id": 1,
        "name": "Mercedes"
      }
    ]
}
]
我必须以某种方式存储这些数据,并能够对其进行过滤。结果也应该是JSON格式,因为它将在整个过程的下一步中使用。我的ASP.NET应用程序使用SQL SERVER(2012年和2016年)

假设用户想要得到所有拥有名为“法拉利”汽车的人。我应该得到如下结果:

[
{
"firstName": Adam
"lastName": Sheen,
"cars": [
      {
        "id": 0,
        "name": "Ferrari"
      },
      {
        "id": 1,
        "name": "Mercedes"
      }
    ]
}
]
我已经花了一些时间进行研究,我知道Microsoft在SQL SERVER 2016中引入了对存储和查询JSON格式的支持,但它不允许获得分层结果。这是关系数据库,因此结果将是“平面”的表。将JSON映射到数据库中的表也是不可能的,因为JSON可以具有动态结构。它可以是有车的人的名单,也可以是有书的书店

我知道我可以使用NOSQL数据库,比如MongoDB,但我希望在我的项目中避免额外的数据库


我想知道解决此类问题的最佳实践以及如何在.NET中实现。

检索:

刚刚创建并测试了以下数据样本:

CREATE TABLE Users (
    userid int identity(1,1) not null,
    firstName nvarchar(50),
    lastName nvarchar(50)
)

CREATE TABLE Cars (
    id int identity(1,1) not null,
    name nvarchar(50)
)

CREATE TABLE CarsUsers (
    userid int not null,
    id int not null

)

ALTER TABLE Users WITH CHECK   
ADD CONSTRAINT PK_userid PRIMARY KEY CLUSTERED (userid)  

ALTER TABLE Cars WITH CHECK   
ADD CONSTRAINT PK_carid PRIMARY KEY CLUSTERED (id) 

ALTER TABLE CarsUsers WITH CHECK   
ADD CONSTRAINT PK_userid_id PRIMARY KEY CLUSTERED (userid, id)  

ALTER TABLE CarsUsers 
ADD CONSTRAINT FK_userid FOREIGN KEY (userid)  
    REFERENCES Users (userid)  

ALTER TABLE CarsUsers 
ADD CONSTRAINT FK_carid FOREIGN KEY (id)  
    REFERENCES Cars (id)  

INSERT INTO Users VALUES ('John', 'Smith'),('Adam','Sheen')

INSERT INTO Cars VALUES ('BMW'),('Mercedes'),('Audi')

INSERT INTO CarsUsers
SELECT  userid,
        id
FROM Cars
CROSS JOIN Users
所以我把这些数据放在表格里

用户

userid  firstName   lastName
1       John        Smith
2       Adam        Sheen
id  name
1   BMW
2   Mercedes
3   Audi
userid  id
1       1
1       2
1       3
2       1
2       2
2       3
汽车

userid  firstName   lastName
1       John        Smith
2       Adam        Sheen
id  name
1   BMW
2   Mercedes
3   Audi
userid  id
1       1
1       2
1       3
2       1
2       2
2       3
汽车使用者

userid  firstName   lastName
1       John        Smith
2       Adam        Sheen
id  name
1   BMW
2   Mercedes
3   Audi
userid  id
1       1
1       2
1       3
2       1
2       2
2       3
然后在SQL 2016中,我运行以下查询:

SELECT  u.firstName,
        u.LastName,
        (SELECT c.id,
                c.name
        FROM Cars c
        INNER JOIN CarsUsers cu
            ON u.userid = cu.userid
        WHERE c.id = cu.id
        FOR JSON PATH) as cars
FROM Users u
WHERE u.userid = 1
FOR JSON PATH
我会得到:

[
{
"firstName":"John",
"LastName":"Smith",
"cars":[
    {
        "id":1,
        "name":"BMW"
    },
    {
        "id":2,
        "name":"Mercedes"
    },
    {
        "id":3,
        "name":"Audi"
    }
    ]
}
]
因此,您可以从平面表中获取分层JSON

商店

正在尝试加载(在示例中添加小补丁)

输出:

firstName   lastName    id  name
John        Smith       0   BMW
John        Smith       1   Mercedes
John        Smith       2   Audi
Adam        Sheen       0   Ferrari
Adam        Sheen       1   Mercedes

此结果可插入上述表格。

谢谢您的回复。第一部分(在db中创建表)在我的例子中是不可能的,因为我将存储在db中的JSON可以具有动态结构。我无法预测我需要什么桌子。让我们总结一下:JSON必须作为一列中的一条记录存储在DB中。第二部分对我来说真的很重要。我不知道我可以返回JSON格式的结果。这将对我有很大帮助:)您是否可以尝试修改SELECT查询以返回相同的结果,但当您只有一个表时,例如JsonDataTable,列JsonData包含整个JSON示例。如果您将JSON存储在某个列中,它可能具有不可预测的结构,但您必须检索一些过滤数据,那么您需要某种类型的解析器,我打赌它可以用c#或php或任何比SQL更简单的语言来完成。。事实上,您可以将一些表转换为JSON,但这在这种情况下不会有帮助。我有一个想法,我可以明天测试它,并将其添加到我的答案中。感谢您的帮助:)我认为我必须基于用户自定义过滤器创建C#的动态正确查询,该过滤器将过滤我的JSON并以JSON格式返回。