如何使用SQL在两个表之间获得异常

时间:2016-06-13 10:36:38

标签: sql-server stored-procedures

我有两张这样的表:

Table_Registration
Table_login

我同时在两个表中插入相同的数据,但我想如果数据插入到一个表中而其他数据不会插入意味着那么我需要一个例外。

这是我的存储过程。

PROCEDURE [dbo].[Insert_UserInformation] 
    (@FullName varchar(300),
     @FatherName varchar(300),
     @DOB varchar(50),
     @PlaceofBirth varchar(200),
     @EmailId varchar(300),
     @Address varchar(300),
     @State varchar(150),
     @Password varchar(50),
     @Role varchar(50),
     @Status varchar(200) output)
AS
BEGIN
    DECLARE @COUNT1 INT, @COUNT2 int

    SELECT @COUNT1 = COUNT(*) 
    FROM Table_Registraiton 
    WHERE EmailId = @EmailId 

    SELECT @COUNT2 = COUNT(*) 
    FROM Table_login 
    WHERE EmailId = @EmailId 

    IF(@COUNT1 > 0 or @COUNT2 > 0)
    BEGIN
        SET @Status = 'Duplicate'
    END
    ELSE if(@COUNT1 = 0 AND @COUNT2 = 0)
    BEGIN
        INSERT INTO Table_Registration(FullName, FatherName, DOB, PlaceofBirth,
                                       EmailId, Address, State)
        VALUES (@FullName, @FatherName, @DOB, @PlaceofBirth,
                @EmailId, @Address, @State)

        INSERT INTO Table_login (Name, EmailId, Password, Role)
        VALUES (@FullName, @EmailId, @Password, @Role)

        SET @Status = 'Success'
    END
END

我的问题是,如果数据已插入Table_Registration而未插入Table_login,那么我需要状态中的异常作为输出参数。

3 个答案:

答案 0 :(得分:1)

您应该使用事务来确保如果数据未插入到一个表中,则整个操作将失败。这样你就不会有不一致的数据。

你可以这样实现:

BEGIN TRANSACTION AddUserLogin
INSERT INTO Table_Registration(FullName, FatherName, DOB, PlaceofBirth, EmailId, Address, State)
    VALUES (@FullName, @FatherName, @DOB, @PlaceofBirth, @EmailId, @Address, @State)
IF @@Error <> 0
BEGIN
    SET @Status = 'ERROR: There was a problem when creating the registration record.'
    ROLLBACK TRANSACTION AddUserLogin
    RETURN -1
END
INSERT INTO Table_login (Name, EmailId, Password, Role)
    VALUES (@FullName, @EmailId, @Password, @Role)
IF @@Error <> 0
BEGIN
    SET @Status = 'ERROR: There was a problem when creating the login record.'
    ROLLBACK TRANSACTION AddUserLogin
    RETURN -1
END
-- this part will only run if there are no errors above. All the inserts above are only permanently committed to the database at this point.
COMMIT TRANSACTION AddUserLogin
SET @Status = 'Success'

答案 1 :(得分:1)

我认为,如果你因为任何原因不想插入,那么为此提出异常是个坏主意。你可以简单回滚并且不要插入并返回合适的输出来指示proc中发生的事情

尝试这样的事情,(如果有任何suntax错误,请更正)

String str = "These Two\u00A0words";
mail.setSubject(str ,"UTF-8");

答案 2 :(得分:0)

无需使用输出参数来获取客户端的状态,您可以使用RaiseError

首先在一次交易中包装你的插页..

Begin Tran
INSERT INTO Table_Registration(FullName, FatherName, DOB, PlaceofBirth,
                                       EmailId, Address, State)
        VALUES (@FullName, @FatherName, @DOB, @PlaceofBirth,
                @EmailId, @Address, @State)

        INSERT INTO Table_login (Name, EmailId, Password, Role)
        VALUES (@FullName, @EmailId, @Password, @Role)
Set @status='Success'
Commit tran

然后在Catch块中,使用RaiseError

Begin Catch
RAISERROR('Insert Failed',16,1)
End Catch