Sql 多个插入的存储过程,如果一个插入失败,则退出
我有一个EAV表,对于每个单独的属性,我有一个新行,如下所示:Sql 多个插入的存储过程,如果一个插入失败,则退出,sql,sql-server,database,stored-procedures,entity-attribute-value,Sql,Sql Server,Database,Stored Procedures,Entity Attribute Value,我有一个EAV表,对于每个单独的属性,我有一个新行,如下所示: PersonID AtributeName AtributeValue ----------------------------------- 1 Name John 1 Gender Male 1 Height 170 CREATE PROCEDURE dbo.InserSubject @ID int, @Na
PersonID AtributeName AtributeValue
-----------------------------------
1 Name John
1 Gender Male
1 Height 170
CREATE PROCEDURE dbo.InserSubject
@ID int,
@Name varchar(50),
@Gender varchar(50),
@Height int
AS
INSERT INTO Subjects
VALUES (1, 'Name', 'John'),
(1, 'Gender', 'Male'),
(1, 'Height', 170);
问题是,如果我想插入一个新的人(ID为2,姓名为Jack,男性,身高180),我需要再插入3个,而且还有一个或多个更改可能会失败。我正在考虑将所有这些插入包含在一个带有参数(ID、名称、性别、高度等)的存储过程中
我的问题是,这样做:
PersonID AtributeName AtributeValue
-----------------------------------
1 Name John
1 Gender Male
1 Height 170
CREATE PROCEDURE dbo.InserSubject
@ID int,
@Name varchar(50),
@Gender varchar(50),
@Height int
AS
INSERT INTO Subjects
VALUES (1, 'Name', 'John'),
(1, 'Gender', 'Male'),
(1, 'Height', 170);
如果其中一个插入失败,是否会失败?这种类型的数据库/表是这样的实现吗?您可以使用TRY-CATCH来实际捕获错误(如果有)。发送一个xml对象(id、键、值),然后插入select from xml,无需进行错误处理。我认为使用TRY-CATCH比使用xml对象更容易实现,只是因为我不知道如何实现。但是谢谢你!每个SQL操作都是原子的,INSERT也是原子的——它要么失败,要么通过,它不可能部分插入数据。在本例中,虽然要插入三行,但这是一个单一的INSERT命令—要么全部插入,要么不插入。还有一个,如果我不传递Height参数(因为它是可选的),该怎么办它会将其设置为null吗?是的,您可以传递null,但不建议这样做,因此您可以使用一些中性值(如0或-1)来代替null
CREATE PROCEDURE dbo.InserSubject @ID int, @Name varchar(50), @Gender varchar(50), @ Height int
AS
BEGIN TRY
INSERT into Subjects Values (1,'Name','John'),(1,'Gender','Male'),
(1,'Height',170);
END TRY
BEGIN CATCH
error_message()
END CATCH