首页 > 解决方案 > 根据来自第一个存储过程 #1 的输入触发另一个存储过程 #1 中的存储过程 #2

问题描述

我需要创建一个存储过程,它根据第一个存储过程摄取的内容触发另一个存储过程。

我有一个名为“Data_Table”的主表,它摄取 JSON 字符串。在 JSON 字符串中是另一个 JSON 字符串,它是单独表的数据。

我的目标是:当主表根据“data_set_id”提取此数据时,它会指示嵌入在表中的 JSON 通过已设置的单独存储过程自动提取到另一个表中。例如:

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

    INSERT INTO Data_Table (
submission_id,
data_set_id,
data_string

)
    SELECT *
    FROM OPENJSON (@JsonData, N'$') WITH (
submission_id varchar(20) N'$.submission_id',
data_set_id varchar(20) N'$.data_set_id',
data_string varchar(1000) N'$.data_string'

    )   

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



END

然后我将通过运行以下查询来执行此操作:

   DECLARE @RC int
DECLARE @JsonData nvarchar(max)

SET @JsonData = N'[{"submission_id":"1","data_set_id":"1","data_string":"[{\"student_id\":1,\"full_name\":\"John Smith\",\"submission_id\":\"1\",\"data_set_id\":\"1\"}]"}]
for json path'
EXECUTE @RC = [dbo].[INSERT_DATA_TABLE_JSON] @JsonData
IF @RC = 0 PRINT 'OK'
ELSE PRINT 'Error'

如您所见,在 Data_Table 的“data_string”列中,我们有另一个 JSON。此 data_set_id =1 仅表示此数据与特定表相关,在本例中,我的 Student 表具有以下存储过程:

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

    INSERT INTO Students (
student_id,
full_name,
submission_id,
data_set_id

)
    SELECT *
    FROM OPENJSON (@JsonData, N'$') WITH (

student_id varchar(20) N'$.student_id',
full_name varchar(20) N'$.full_name',
submission_id varchar(20) N'$.submission_id',
data_set_id varchar(20) N'$.data_set_id'

    )   

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



END

我如何自动允许第一个存储过程读取嵌入的 JSON 或其他内容的内容,然后让它知道它必须使用该数据来填写相应的学生表。

这是 JSON 字符串以防万一:

[{"submission_id":"1","data_set_id":"1","data_string":"[{\"student_id\":1,\"full_name\":\"John Smith\",\"submission_id\":\"1\",\"data_set_id\":\"1\"}]"}]

我有第二个名为 Lecturers 的表,我已为其分配了 data_set_id = 2,因此当嵌入式 JSON 的 data_set_id = 2 时,它会将其定向到讲师表。

标签: jsonsql-serverstored-procedurestriggersinsert

解决方案


推荐阅读