Sql server 如何在一个查询中更新2个表

Sql server 如何在一个查询中更新2个表,sql-server,vb.net,sql-update,Sql Server,Vb.net,Sql Update,我有两张桌子: 登录具有4个属性: 1. NRIC 2. NAME 3. PASSWORD 4. TYPE (USER / ADMIN) 1. NRIC 2. NAME 3. PASSWORD 4. EMAIL 详细信息具有4个属性: 1. NRIC 2. NAME 3. PASSWORD 4. TYPE (USER / ADMIN) 1. NRIC 2. NAME 3. PASSWORD 4. EMAIL 如果更新了表详细信息,我希望更新表登录名 例如,

我有两张桌子:

登录
具有4个属性:

 1. NRIC
 2. NAME
 3. PASSWORD
 4. TYPE (USER / ADMIN)
 1. NRIC
 2. NAME
 3. PASSWORD
 4. EMAIL
详细信息
具有4个属性:

 1. NRIC
 2. NAME
 3. PASSWORD
 4. TYPE (USER / ADMIN)
 1. NRIC
 2. NAME
 3. PASSWORD
 4. EMAIL
如果更新了表
详细信息
,我希望更新表
登录名

例如,如果更新了表
详细信息
中的
密码
,则假定的表
登录
也应更新

SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'"

如何更新它们

首先更新详细信息表。 然后提交更改。 然后更新登录表。
事务:D

为此使用SqlTransaction,下面是参考代码:

C#:

    SqlConnection conn = new SqlConnection("[Your connection string]");
    conn.Open();
    SqlTransaction Trans = conn.BeginTransaction();
    SqlCommand SQLCmd = new SqlCommand("",conn);
    SQLCmd.Transaction = Trans;
    try
    {
        SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'";
        SQLCmd.ExecuteNonQuery();
        SQLCmd.CommandText = "UPDATE Login  set PASSWORD='" & TextBoxPassword.Text & "' WHERE NRIC='" & myVar2 & "'";
        SQLCmd.ExecuteNonQuery();
        Trans.Commit();

    }
    catch
    {
        Trans.Rollback();
    }
    finally {
        conn.Close();

    } 
Dim conn As New SqlConnection("[Your connection string]")
conn.Open()
Dim Trans As SqlTransaction = conn.BeginTransaction()
Dim SQLCmd As New SqlCommand("", conn)
SQLCmd.Transaction = Trans
Try
  SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" And TextBoxPassword.Text And "',EMAIL='" And TextBoxEmail.Text And "' WHERE NRIC='" And myVar2 And "'"
  SQLCmd.ExecuteNonQuery()
  SQLCmd.CommandText = "UPDATE Login  set PASSWORD='" And TextBoxPassword.Text And "' WHERE NRIC='" And myVar2 And "'"
  SQLCmd.ExecuteNonQuery()

  Trans.Commit()
Catch
  Trans.Rollback()
Finally

  conn.Close()
End Try
VB:

    SqlConnection conn = new SqlConnection("[Your connection string]");
    conn.Open();
    SqlTransaction Trans = conn.BeginTransaction();
    SqlCommand SQLCmd = new SqlCommand("",conn);
    SQLCmd.Transaction = Trans;
    try
    {
        SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'";
        SQLCmd.ExecuteNonQuery();
        SQLCmd.CommandText = "UPDATE Login  set PASSWORD='" & TextBoxPassword.Text & "' WHERE NRIC='" & myVar2 & "'";
        SQLCmd.ExecuteNonQuery();
        Trans.Commit();

    }
    catch
    {
        Trans.Rollback();
    }
    finally {
        conn.Close();

    } 
Dim conn As New SqlConnection("[Your connection string]")
conn.Open()
Dim Trans As SqlTransaction = conn.BeginTransaction()
Dim SQLCmd As New SqlCommand("", conn)
SQLCmd.Transaction = Trans
Try
  SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" And TextBoxPassword.Text And "',EMAIL='" And TextBoxEmail.Text And "' WHERE NRIC='" And myVar2 And "'"
  SQLCmd.ExecuteNonQuery()
  SQLCmd.CommandText = "UPDATE Login  set PASSWORD='" And TextBoxPassword.Text And "' WHERE NRIC='" And myVar2 And "'"
  SQLCmd.ExecuteNonQuery()

  Trans.Commit()
Catch
  Trans.Rollback()
Finally

  conn.Close()
End Try

那些已经用“提交并回滚”解决方案发布答案的人是错误的。这些解决方案并不认为查询实际上执行了“更新”的细节。此解决方案确保在执行第二个查询之前,第一个查询实际“更新”了一行的详细信息

这里的代码比SQL解决方案更像VB:

Dim intTotalRowsUpdated As Integer
SQLCmd.CommandText = "UPDATE DETAILS set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'"
intTotalRowsUpdated = SQLCmd.ExecuteNonQuery()
If intTotalRowsUpdated > 0 Then
    SQLCmd.CommandText = "UPDATE login set PASSWORD='" & TextBoxPassword.Text & "',EMAIL='" & TextBoxEmail.Text & "' WHERE NRIC='" & myVar2 & "'"
    SQLCmd.ExecuteNonQuery
End If

如果你真的在寻找更新一个表,只要更新了一个表,你可能需要考虑一个触发器:

create trigger trigUpdateDetails
on details
after update
as
begin
    update login
    set 
        password=ins.password
    from login td
    join inserted ins on td.nric = ins.nric
end
此触发器会导致详细信息表的任何更新也会更新登录表的密码字段,无论更新是源于客户端应用程序还是源于在数据库级别运行的语句

更多信息:


这篇文章有点过时,但文章中的信息仍然相关。

您可以使用存储过程来执行此任务。 像下面这样

CREATE PROC proc_UpdateProcedure    
@PASSWORD VARCHAR(100),     
@NRIC INT    
AS    
DECLARE @Ret INT  

BEGIN TRANSACTION    
 BEGIN TRY  
  -- UPDATE DETAILS TABLE  
  UPDATE DETAILS SET PASSWORD = @PASSWORD WHERE NRIC = @NRIC

  -- UPDATE Login TABLE
  UPDATE Login SET PASSWORD = @PASSWORD WHERE NRIC = @NRIC 

  COMMIT TRANSACTION  
  SET @Ret = 1  
  SELECT @Ret  
 END TRY  
 BEGIN CATCH   
  ROLLBACK TRANSACTION  
  SET @Ret = 0  
  SELECT @Ret  
 END CATCH  

如果您将其更改为参数化sql,我将给您一个+1。