Sql server 如何使用SQL获取两个表之间的异常

Sql server 如何使用SQL获取两个表之间的异常,sql-server,stored-procedures,Sql Server,Stored Procedures,我有两张这样的桌子: Table_Registration Table_login BEGIN TRANSACTION AddUserLogin INSERT INTO Table_Registration(FullName, FatherName, DOB, PlaceofBirth, EmailId, Address, State) VALUES (@FullName, @FatherName, @DOB, @PlaceofBirth, @EmailId, @Address, @S

我有两张这样的桌子:

Table_Registration
Table_login
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'
我将同时向两个表中插入相同的数据,但我希望如果插入一个表中的数据和另一个表中的数据不插入意味着我需要一个异常

这是我的存储过程

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
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'
开始事务AddUserLogin
插入表_注册(全名、父名、出生日期、出生地点、电子邮件ID、地址、州)
值(@FullName、@FatherName、@DOB、@PlaceofBirth、@EmailId、@Address、@State)
如果@错误0
开始
SET@Status='错误:创建注册记录时出现问题。'
回滚事务AddUserLogin
返回-1
结束
在表中插入登录名(名称、电子邮件ID、密码、角色)
值(@FullName、@EmailId、@Password、@Role)
如果@错误0
开始
SET@Status='错误:创建登录记录时出现问题。'
回滚事务AddUserLogin
返回-1
结束
--只有在上面没有错误的情况下,此部件才会运行。此时,上面的所有插入仅永久提交到数据库。
提交事务AddUserLogin
设置@Status='Success'

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

您可以这样实现它:

Table_Registration
Table_login
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'
开始事务AddUserLogin
插入表_注册(全名、父名、出生日期、出生地点、电子邮件ID、地址、州)
值(@FullName、@FatherName、@DOB、@PlaceofBirth、@EmailId、@Address、@State)
如果@错误0
开始
SET@Status='错误:创建注册记录时出现问题。'
回滚事务AddUserLogin
返回-1
结束
在表中插入登录名(名称、电子邮件ID、密码、角色)
值(@FullName、@EmailId、@Password、@Role)
如果@错误0
开始
SET@Status='错误:创建登录记录时出现问题。'
回滚事务AddUserLogin
返回-1
结束
--只有在上面没有错误的情况下,此部件才会运行。此时,上面的所有插入仅永久提交到数据库。
提交事务AddUserLogin
设置@Status='Success'

无需使用输出参数来获取客户端的状态,您可以使用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

不需要使用输出参数来获取客户端的状态,您可以使用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

我认为,如果您出于任何原因不想插入,那么为此引发异常是个坏主意。您可以简单地回滚,不插入并返回适当的输出,以指示进程中发生了什么

尝试类似的方法(如果有任何suntax错误,请更正)


我认为,如果您出于任何原因不想插入,那么为此引发异常是个坏主意。您可以简单地回滚,不插入并返回适当的输出,以指示进程中发生了什么

尝试类似的方法(如果有任何suntax错误,请更正)