2016-07-05 43 views
-2

我将一个表的标识值存储到外键中的另一个表中,但在尝试创建关系时,I得到一个错误332我将一个表的身份值存储到外键中的另一个表中,但是当它建立关系时,它给了我错误

ALTER proc [dbo].[spRegisterUser] 
    @Doj date, 
    @UserName nvarchar(100), 
    @Password nvarchar(10), 
    @Reference nvarchar(50), 
    @Aadhar nvarchar(50), 
    @Email nvarchar(50) 
AS 
BEGIN 
    Declare @count int 
    Declare @ReturnCode int 

    Select @count = COUNT(UserName) 
    from tblUsers where UserName = @UserName 
    if @count > 0 
    Begin 
     Set @ReturnCode = -1 
    End 
    Else 
    Begin 
     Set @ReturnCode = 1 

     insert into tblUsers (DoJ,UserName,Password,Reference,Aadhar,Email) 
     Output inserted.User_ID into tblUserProfiles(UserID) 
     values (@DoJ,@UserName,@Password,@Reference,@Aadhar,@Email) 
    End 
    Select @ReturnCode as ReturnValue 
end  

错误是:

的OUTPUT INTO子句的目标表“tblUserProfiles”不能是一个(主键,外键)的关系的任一侧。找到参考约束'FK_tblUserProfiles_tblUsers'。

如何克服这个问题?我需要PK FK关系,我也希望FK值自动保存在列中。

请为我找到解决方案。由于

+0

怎么样代码?你如何创建你的数据库?没有这些信息,就不可能找出错误。 – 2016-07-05 01:17:54

+0

您正在插入一条记录。没有理由完全使用输出子句。只需使用一个变量来保存@@ SCOPE_IDENTITY,并且您还好 – cha

+0

@cha。 。 。这确实是非常糟糕的建议。从'insert'返回id的正确方法是OP如何使用'OUTPUT'来执行操作。 –

回答

0

由于此存储过程真的永远只能插入一个数据单列,你可以使用此代码:

declare @NewUserID INT 

insert into tblUsers (DoJ, UserName, Password, Reference, Aadhar, Email) 
values (@DoJ, @UserName, @Password, @Reference, @Aadhar, @Email); 

-- get the newly created ID for the new user 
SELECT @NewUserID = SCOPE_IDENTITY(); 

-- insert into the other table 
INSERT INTO dbo.tblUserProfiles (UserID) 
VALUES (@NewUserID); 

这是假设在tblUsersUser_ID列实际上是一个标识列。

0

另一种选择是在用户表上使用插入触发器,插入用户表时将插入记录到用户配置文件表中。这种方法的好处是,即使用户直接插入到你的表(我的意思是,不使用存储过程),他们仍然会在用户配置文件表创造了一个纪录:

CREATE TRIGGER tblUsers_INSERT ON tblUsers 
FOR INSERT 
AS 
BEGIN 

    INSERT INTO tblUserProfiles(UserId) 
    SELECT User_ID 
    FROM Inserted 

END 
相关问题