Sql 多个插入的存储过程,如果一个插入失败,则退出

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

我有一个EAV表,对于每个单独的属性,我有一个新行,如下所示:

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