【发布时间】:2020-10-13 11:31:05
【问题描述】:
以下存储过程INSERT1 可以正常工作。它根据 data_type_id 触发存储过程INSERT2 并将数据插入到单独的表中。但是我想编辑这个存储过程INSERT1(或INSERT2),这样,如果没有行通过INSERT2 插入TABLE2,那么我想回滚INSERT1。我在想也许可以使用类似的东西
Set @rows_affected = @@rowcount
if ((@rows_affected = 0))
ROLLBACK TRANSACTION
但我不确定如何编辑该过程,如果没有通过存储过程 INSERT2 插入任何行,则回滚两个存储过程 INSERT1 和 INSERT2。
Create PROCEDURE INSERT1 (
@JsonData NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @err int
declare @submission_id varchar(32)
declare @dataset_id varchar(32)
declare @json varchar(max)
DECLARE @v_data_type_id varchar(50)
Set @v_data_type_id = (SELECT data_type_id
FROM OPENJSON (@JsonData, N'$')
WITH (data_type_id varchar(32) '$.dataTypeId'))
set @json = @JsonData
Begin TRANSACTION
INSERT INTO TABLE1 (
submission_id,
data_set_id,
data_type_id,
)
SELECT *
FROM OPENJSON (@json, N'$') WITH (
submission_id varchar(32) N'$.submissionId',
data_set_id varchar(32) N'$.dataSetId',
data_type_id varchar(50) N'$.dataTypeId',
)
if ((@v_data_type_id = '1'))
BEGIN
exec [dbo].[INSERT2] @json
IF @@ROWCOUNT = 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
END
COMMIT TRANSACTION
END
GO
这是 INSERT2 脚本:
CREATE PROCEDURE INSERT2 (
@Json_PMU1 NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @err int
DECLARE @submission_id varchar(32)
DECLARE @dataset_id varchar(32)
SELECT @submission_id = submission_id,
@dataset_id = data_set_id
from openjson(@Json_PMU1, N'$')
with (
submission_id varchar(32) N'$.submissionId',
data_set_id varchar(32) N'$.dataSetId'
)
INSERT INTO TABLE2 (
name,
contact_number,
submission_id,
data_set_id
)
select Name as name,
contactNumber as contact_number,
@submission_id as submission_id,
@dataset_id as data_set_id
--into TABLE2
from openjson (@Json_PMU1, '$.data.Table2')
with (
Name varchar(255) ,
contactNumber char(11)
)
SELECT @err = @@ERROR
RETURN (@err)
END
【问题讨论】:
-
你不确定这里有什么?
-
@Larnu 如何编辑存储过程,如果 INSERT2 插入 0 行则回滚整个过程,INSERT1 & INSERT2
-
在插入之前插入
begin tran,之后有条件的回滚?
标签: json sql-server database stored-procedures triggers