创建一个存储过程,在读取JSON字符串后摄取数据。

问题描述 投票:0回答:1

我想在SQL Server中创建一个存储过程,它可以接受JSON数据,并将其上传到一个指定的表中的相关列中。例如,取这个JSON字符串。

[{"ID":5,"LastName":"Donalds","FirstName":"Dave","Age":23,"City":"London"}]

上面的这个字符串可以通过下面的查询来生成

SELECT 
5 as 'ID',
'Donalds' as 'LastName',
'Dave' as 'FirstName',
23 as 'Age',
'London' as 'City'
FOR JSON PATH

我设法写了一个脚本,可以上传到我的表 "Person "中。我的表有以下的CREATE脚本。

CREATE TABLE [dbo].[Persons](
    [ID] [int] NOT NULL,
    [LastName] [varchar](255) NOT NULL,
    [FirstName] [varchar](255) NULL,
    [Age] [int] NULL,
    [City] [varchar](255) NULL
) ON [PRIMARY]
GO

我已经成功地写了一个脚本,可以将上述JSON上传到我的表中,但是我想在存储过程中进一步自动化它。上传上述JSON的脚本是。

DECLARE @jsonVariable varchar(max);

Set @jsonVariable = N'[{"ID":5,"LastName":"Donalds","FirstName":"Dave","Age":23,"City":"London"}]';

INSERT INTO Persons Select * 
FROM OPENJSON (@jsonVariable, N'$')
  WITH (
    ID INT N'$.ID',
    LastName VARCHAR(50) N'$.LastName',
    FirstName VARCHAR(50) N'$.FirstName',
    Age INT N'$.Age',
    City VARCHAR(50) N'$.City'
  ) 

所以我的目标是创建一个存储过程 它的执行函数是这样的:

 EXEC InsertPersonsJSON 
'[{"ID":5,"LastName":"Donalds","FirstName":"Dave","Age":23,"City":"London"}]'

然而,我不知道如何在创建存储过程的步骤中分离变量 为JSON数据。

我想要的结果是我的表中的最后一行。

ID  LastName    FirstName   Age   City

5   Donalds     Dave        23    London

谢谢你的帮助,如果我的问题需要进一步澄清,请告诉我!:)

json sql-server stored-procedures automation sql-insert
1个回答
1
投票

如果我理解正确,你想 ... 在SQL Server中创建一个存储过程,可以接受JSON数据,并将其上传到一个指定的表中的相关列中。,你真的很接近了。你需要创建这个存储过程并包含你的SQL语句。

存储过程:

CREATE PROCEDURE InsertPersonsJSON (
    @JsonData NVARCHAR(MAX)
)
AS
BEGIN
    DECLARE @err int

    INSERT INTO Persons (ID, LastName, FirstName, Age, City)
    SELECT ID, LastName, FirstName, Age, City
    FROM OPENJSON (@JsonData, N'$') WITH (
        ID INT N'$.ID',
        LastName VARCHAR(50) N'$.LastName',
        FirstName VARCHAR(50) N'$.FirstName',
        Age INT N'$.Age',
        City VARCHAR(50) N'$.City'
    )   

    SELECT @err = @@ERROR
    RETURN (@err)
END

执行:

DECLARE @RC int
DECLARE @JsonData nvarchar(max)

SET @JsonData = N'[{"ID":5,"LastName":"Donalds","FirstName":"Dave","Age":23,"City":"London"}]'
EXECUTE @RC = InsertPersonsJSON @JsonData

IF @RC = 0 PRINT 'OK'
ELSE PRINT 'Error'
© www.soinside.com 2019 - 2024. All rights reserved.