插入两个有关系的表的存储过程?

Ye *_*ung 4 sql stored-procedures

我试图将一个新行插入两个表之间的关系.我编写了如下存储过程.

ALTER PROCEDURE InsertUserProfile
(
    @UserID varchar(10),
    @Pass varchar(50),
    @Enabled int,
    @Permission int,
    @Rank int,
    @FName varchar(50),
    @LName varchar(50),
    @Phone varchar(50),
    @Email1 varchar(50),
    @Email2 varchar(50)
)
AS

BEGIN TRANSACTION
INSERT INTO tbl_user_login VALUES (@UserID, @Pass, @Enabled, @Permission, @Rank)
IF @@ERROR <> 0
BEGIN 
    ROLLBACK
    RETURN
END


INSERT INTO tbl_user_profile VALUES (@FName, @LName, @Phone, @Email1, @Email2)
IF @@ERROR <> 0
BEGIN
    ROLLBACK
    RETURN
END

COMMIT
Run Code Online (Sandbox Code Playgroud)

从这里遵循ASP.NET代码

SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnString"].ConnectionString);
        SqlCommand cmd = new SqlCommand("dbo.InsertUserProfile", sqlConn);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@UserID", DbType.String).Value = txtUserID.Text;
        cmd.Parameters.Add("@Pass", DbType.String).Value = txtPass.Text;
        cmd.Parameters.Add("@Enabled", DbType.Int32).Value = 1;
        cmd.Parameters.Add("@Permission", DbType.Int32).Value = Convert.ToInt32(ddlPermission.SelectedValue);
        cmd.Parameters.Add("@Rank", DbType.Int32).Value = Convert.ToInt32(ddlRank.SelectedValue);
        cmd.Parameters.Add("@FName", DbType.String).Value = txtFName.Text;
        cmd.Parameters.Add("@LName", DbType.String).Value = txtLName.Text;
        cmd.Parameters.Add("@Phone", DbType.String).Value = txtPhone.Text;
        cmd.Parameters.Add("@Email1", DbType.String).Value = txtEmail1.Text;
        cmd.Parameters.Add("@Email2", DbType.String).Value = txtEmail2.Text;

        sqlConn.Open();
        int rows = cmd.ExecuteNonQuery();
        sqlConn.Close();
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误.

INSERT语句与FOREIGN KEY约束"FK_tbl_user_profile_tbl_user_login"冲突.冲突发生在数据库"我的数据库位置",表"dbo.tbl_user_login",列"ID"中.该语句已终止.

我是Stored Procedures的新手,所以我应该如何修复它以便我可以将数据插入两个表中?

表格模式

tbl_user_login

ID (int) 
UserID (varchar10) 
Pass (varchar50) 
Enabled (int) 
Permission (int) 
Rank (int)

tbl_user_profile

ID (int)
FName (varchar50)
LName (varchar50)
Phone (varchar50)
Email1 (varchar50)
Email2 (varchar50)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

@Richard它的"ID"是两个表中的自动增量.

使用auto-increment(IDENTITY)作为主键很好,但是将它用作外键是危险的,因为你不能真正保证它们总是同步; 任何回滚都可能使它们断开(回滚不会撤消身份增量,因为这会影响其他SPID).此外,两个并发INSERTs 之间的任何线程竞争都将处于危险之中.

这里正确的方法是SCOPE_IDENTITY()在第一次插入后查询,并INSERT在第二个表中使用它; 即在第二个表中你告诉它值.请注意,由于@@ERRORSCOPE_IDENTITY()是浮动值,您应该在第一个之后直接查询它们INSERT:

SELECT @Error = @@ERROR, @NewId = SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)