MS-SQL Server同时更新一张表中多个字段的值

时间:2021-12-15 14:59:17
表格字段如图,图中只是展示了部分数据
MS-SQL Server同时更新一张表中多个字段的值
图片中可以看出被修改MAC数据是在哪个字段,但是实际操作是并不知道在哪个字段(即不知道是在MAC1还是在MAC2)。
现在我想实现以下操作:
把“00231FABCAB1”修改为“00231FABCAB2”
把“00231FABCAB3”修改为“00231FABCAB4”
把“00231FABCAB5”修改为“00231FABCAB6”
把“00231FABCAB7”修改为“00231FABCAB8”
。。。
。。。
。。。
请问用SQL语句怎么实现,而且执行的速率也比较快,性能好。因为数据库每天都会有几千条的数据被存进去,目前已经有近百万条数据了。
我用了下面的语句:
update MAC2SN set MAC1=case MAC1
when '00231F70EA30' then '00231F'
when '00231F70EA32' then '00231FABF'
end,
MAC2=case MAC2
when '00231F70EA30' then '00231FABD'
when '00231F70EA32' then '00231FABF'
end
where MAC1 in ('00231F70EA30','00231F70EA32') or MAC2 in ('00231F70EA30','00231F70EA32')
发现当MAC1被更新后,其对应的MAC2则成了NULL。如下图
MS-SQL Server同时更新一张表中多个字段的值
请教下大家,该怎么弄。我对SQL语句不熟练,只会简单的,折腾我一下午了。 MS-SQL Server同时更新一张表中多个字段的值

18 个解决方案

#1


还有就是我想实现大批量(成百上千条)的更新。只给出原MAC值与其更新后的MAC值,举个例子:
把“00231FABCAB1”修改为“00231FABCAB2”
把“00231FABCAB3”修改为“00231FABCAB4”
把“00231FABCAB5”修改为“00231FABCAB6”
把“00231FABCAB7”修改为“00231FABCAB8”
。。。(这里还有很多)

这样的话又该怎么弄比较好呢。

#2


两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。

#3


只能用case来判断吧,这样效率不会太高

#4


引用 2 楼 wtujedp 的回复:
两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。

#5


引用 3 楼 xiaoxiangqing 的回复:
只能用case来判断吧,这样效率不会太高


就是啊。而且如果用case,大批量修改的话,那语句太长了。
我看了微软给的这段C#代码,倒是有点想用循环来完成。

using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction("SampleTransaction");

        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();

            // Attempt to commit the transaction.
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);

            // Attempt to roll back the transaction.
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred
                // on the server that would cause the rollback to fail, such as
                // a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
            }
        }
    }

#6


别用case whern,每一个update执行两句sql,一句更新mac1,另一句更新mac2

#7


引用 6 楼 xdashewan 的回复:
别用case whern,每一个update执行两句sql,一句更新mac1,另一句更新mac2


你的意思是不是有多少条记录要更新,就执行多少次Update。我是在客户端来完成更新数据库的操作。


我看了微软的C#代码,有点想用循环来执行Update。代码我在上面贴出来了。

#8


引用 7 楼 SCGH_Fx 的回复:
你的意思是不是有多少条记录要更新,就执行多少次Update。我是在客户端来完成更新数据库的操作。
我看了微软的C#代码,有点想用循环来执行Update。代码我在上面贴出来了。

循环当然可以是可以,但如果数目上去可能会有性能问题。你可以建一张要更新的表,把更新条件和值插进去,然后分两句执行关联update,一句关联mac1更新mac1,另一句关联mac2更新mac2

#9


引用 4 楼 SCGH_Fx 的回复:
Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。

#10


引用 8 楼 xdashewan 的回复:
Quote: 引用 7 楼 SCGH_Fx 的回复:

你的意思是不是有多少条记录要更新,就执行多少次Update。我是在客户端来完成更新数据库的操作。
我看了微软的C#代码,有点想用循环来执行Update。代码我在上面贴出来了。

循环当然可以是可以,但如果数目上去可能会有性能问题。你可以建一张要更新的表,把更新条件和值插进去,然后分两句执行关联update,一句关联mac1更新mac1,另一句关联mac2更新mac2


我忘了说了,操作是在客户端完成的。

大批量的操作不是经常有,操作频率较高的是小批量(几条,10来条)的。这样的话,用循环是不是比较合理。

#11


引用 10 楼 SCGH_Fx 的回复:
我忘了说了,操作是在客户端完成的。

大批量的操作不是经常有,操作频率较高的是小批量(几条,10来条)的。这样的话,用循环是不是比较合理。

数量不多用循环没什么问题,10来条没什么压力

#12


引用 11 楼 xdashewan 的回复:
Quote: 引用 10 楼 SCGH_Fx 的回复:

我忘了说了,操作是在客户端完成的。

大批量的操作不是经常有,操作频率较高的是小批量(几条,10来条)的。这样的话,用循环是不是比较合理。

数量不多用循环没什么问题,10来条没什么压力


嗯。那我就用循环了。我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。

#13


引用 9 楼 wtujedp 的回复:
Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。

#14


update MAC2SN
set MAC1 = case MAC1 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC1 end,
      MAC2 = case MAC2 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC2 end

#15


引用 13 楼 SCGH_Fx 的回复:
Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


你这边是不是只有两个MAC1和MAC2两个字段,你不知道这一次更新的是哪一个字段,
如果你MAC1更新了,则必须去对应的

引用 13 楼 SCGH_Fx 的回复:
Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


update MAC2SN set mac1='00231F70E70E' where mac1='00231F70EA46'
update MAC2SN set mac2='00231F70E70E' where mac2='00231F70EA46'

#16


引用 15 楼 wtujedp 的回复:
Quote: 引用 13 楼 SCGH_Fx 的回复:

Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


你这边是不是只有两个MAC1和MAC2两个字段,你不知道这一次更新的是哪一个字段,
如果你MAC1更新了,则必须去对应的

引用 13 楼 SCGH_Fx 的回复:
Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


update MAC2SN set mac1='00231F70E70E' where mac1='00231F70EA46'
update MAC2SN set mac2='00231F70E70E' where mac2='00231F70EA46'


感谢,14楼的语句更方便一点。

#17


引用 14 楼 xdashewan 的回复:
update MAC2SN
set MAC1 = case MAC1 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC1 end,
      MAC2 = case MAC2 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC2 end


感谢。

#18


我把我最后的代码贴出来:

public void ExecuteMACSTransaction(string[] oldvalues, string[] newvalues, DataBaseSelected dbs, string ip)
        {
            string connectionString = "Data Source=" + ip + ";Persist Security Info=True;Initial Catalog=MACSN数据管理;User ID=sa;Password=sql";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = connection.CreateCommand();
                SqlTransaction transaction;

                // Start a local transaction.
                transaction = connection.BeginTransaction("SampleTransaction");

                // Must assign both transaction object and connection
                // to Command object for a pending local transaction
                command.Connection = connection;
                command.Transaction = transaction;
                try
                {
                    int count = oldvalues.Length;
                    switch (dbs)
                    {
                        case DataBaseSelected.MAC1SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC='{0}' where MAC='{1}'",newvalues[i],oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC2SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end where MAC1='{4}' or MAC2='{5}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC3SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end where MAC1='{6}' or MAC2='{7}' or MAC3='{8}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery(); 
                            }
                            break;
                        case DataBaseSelected.MAC4SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end,MAC4=case MAC4 when '{6}' then '{7}'else MAC4 end where MAC1='{8}' or MAC2='{9}' or MAC3='{10}' or MAC4='{11}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery(); 
                            }
                            break;
                        case DataBaseSelected.MAC21SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC='{0}' where MAC='{1}'", newvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC22SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end where MAC1='{4}' or MAC2='{5}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC23SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end where MAC1='{6}' or MAC2='{7}' or MAC3='{8}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC24SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end,MAC4=case MAC4 when '{6}' then '{7}'else MAC4 end where MAC1='{8}' or MAC2='{9}' or MAC3='{10}' or MAC4='{11}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC31SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC='{0}' where MAC='{1}'", newvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC32SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end where MAC1='{4}' or MAC2='{5}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC33SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end where MAC1='{6}' or MAC2='{7}' or MAC3='{8}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC34SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end,MAC4=case MAC4 when '{6}' then '{7}'else MAC4 end where MAC1='{8}' or MAC2='{9}' or MAC3='{10}' or MAC4='{11}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        default:
                            break;
                    }
                    
                    transaction.Commit();
                    connection.Close();
                    connection.Dispose();
                }
                catch (Exception ex)
                {
                    connection.Close();
                    connection.Dispose();
                    DevExpress.XtraEditors.XtraMessageBox.Show(ex.Message,"提示");
                }

            }
        }

#1


还有就是我想实现大批量(成百上千条)的更新。只给出原MAC值与其更新后的MAC值,举个例子:
把“00231FABCAB1”修改为“00231FABCAB2”
把“00231FABCAB3”修改为“00231FABCAB4”
把“00231FABCAB5”修改为“00231FABCAB6”
把“00231FABCAB7”修改为“00231FABCAB8”
。。。(这里还有很多)

这样的话又该怎么弄比较好呢。

#2


两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。

#3


只能用case来判断吧,这样效率不会太高

#4


引用 2 楼 wtujedp 的回复:
两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。

#5


引用 3 楼 xiaoxiangqing 的回复:
只能用case来判断吧,这样效率不会太高


就是啊。而且如果用case,大批量修改的话,那语句太长了。
我看了微软给的这段C#代码,倒是有点想用循环来完成。

using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction("SampleTransaction");

        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();

            // Attempt to commit the transaction.
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);

            // Attempt to roll back the transaction.
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred
                // on the server that would cause the rollback to fail, such as
                // a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
            }
        }
    }

#6


别用case whern,每一个update执行两句sql,一句更新mac1,另一句更新mac2

#7


引用 6 楼 xdashewan 的回复:
别用case whern,每一个update执行两句sql,一句更新mac1,另一句更新mac2


你的意思是不是有多少条记录要更新,就执行多少次Update。我是在客户端来完成更新数据库的操作。


我看了微软的C#代码,有点想用循环来执行Update。代码我在上面贴出来了。

#8


引用 7 楼 SCGH_Fx 的回复:
你的意思是不是有多少条记录要更新,就执行多少次Update。我是在客户端来完成更新数据库的操作。
我看了微软的C#代码,有点想用循环来执行Update。代码我在上面贴出来了。

循环当然可以是可以,但如果数目上去可能会有性能问题。你可以建一张要更新的表,把更新条件和值插进去,然后分两句执行关联update,一句关联mac1更新mac1,另一句关联mac2更新mac2

#9


引用 4 楼 SCGH_Fx 的回复:
Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。

#10


引用 8 楼 xdashewan 的回复:
Quote: 引用 7 楼 SCGH_Fx 的回复:

你的意思是不是有多少条记录要更新,就执行多少次Update。我是在客户端来完成更新数据库的操作。
我看了微软的C#代码,有点想用循环来执行Update。代码我在上面贴出来了。

循环当然可以是可以,但如果数目上去可能会有性能问题。你可以建一张要更新的表,把更新条件和值插进去,然后分两句执行关联update,一句关联mac1更新mac1,另一句关联mac2更新mac2


我忘了说了,操作是在客户端完成的。

大批量的操作不是经常有,操作频率较高的是小批量(几条,10来条)的。这样的话,用循环是不是比较合理。

#11


引用 10 楼 SCGH_Fx 的回复:
我忘了说了,操作是在客户端完成的。

大批量的操作不是经常有,操作频率较高的是小批量(几条,10来条)的。这样的话,用循环是不是比较合理。

数量不多用循环没什么问题,10来条没什么压力

#12


引用 11 楼 xdashewan 的回复:
Quote: 引用 10 楼 SCGH_Fx 的回复:

我忘了说了,操作是在客户端完成的。

大批量的操作不是经常有,操作频率较高的是小批量(几条,10来条)的。这样的话,用循环是不是比较合理。

数量不多用循环没什么问题,10来条没什么压力


嗯。那我就用循环了。我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。

#13


引用 9 楼 wtujedp 的回复:
Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。

#14


update MAC2SN
set MAC1 = case MAC1 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC1 end,
      MAC2 = case MAC2 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC2 end

#15


引用 13 楼 SCGH_Fx 的回复:
Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


你这边是不是只有两个MAC1和MAC2两个字段,你不知道这一次更新的是哪一个字段,
如果你MAC1更新了,则必须去对应的

引用 13 楼 SCGH_Fx 的回复:
Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


update MAC2SN set mac1='00231F70E70E' where mac1='00231F70EA46'
update MAC2SN set mac2='00231F70E70E' where mac2='00231F70EA46'

#16


引用 15 楼 wtujedp 的回复:
Quote: 引用 13 楼 SCGH_Fx 的回复:

Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


你这边是不是只有两个MAC1和MAC2两个字段,你不知道这一次更新的是哪一个字段,
如果你MAC1更新了,则必须去对应的

引用 13 楼 SCGH_Fx 的回复:
Quote: 引用 9 楼 wtujedp 的回复:

Quote: 引用 4 楼 SCGH_Fx 的回复:

Quote: 引用 2 楼 wtujedp 的回复:

两表关联更新

update t1 set mac1=t2.mac2 from t1 inner join T2 on t1.mac1=t2.mac1 

t1 是你原来的表,需要被更新。
t2 是原MAC与新MAC对应的表

两表根据mac进行关联然后进行更新。


但是t2(原MAC与新MAC对应的表)并不在数据库当中,只是一个对应关系,操作是在客户端完成。按照你的思路,是不是需要建个t2临时表。如果建个临时表,对于大批量修改有必要。但是如果小批量修改,比如只修改一两条数据又显得麻烦。



我一开始是以为你只是批量更新一次的。
现在你的意思是在程序里面每次都要更新,那你只要你循环T2对应表,一个个去更新就行了。


我想再请教一下一个Update语句怎么写。我想更新表“MAC2SN”的某个MAC值,原MAC为“00231F70EA46”,需要更新成“00231F70E70E”,事先不知道是在哪个字段,这该怎么写呢,谢谢了。我帖子中用的SQL语句有错误。
我打算采用循环一条一条更新。


update MAC2SN set mac1='00231F70E70E' where mac1='00231F70EA46'
update MAC2SN set mac2='00231F70E70E' where mac2='00231F70EA46'


感谢,14楼的语句更方便一点。

#17


引用 14 楼 xdashewan 的回复:
update MAC2SN
set MAC1 = case MAC1 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC1 end,
      MAC2 = case MAC2 when ‘00231F70EA46’ then ‘00231F70E70E’ else MAC2 end


感谢。

#18


我把我最后的代码贴出来:

public void ExecuteMACSTransaction(string[] oldvalues, string[] newvalues, DataBaseSelected dbs, string ip)
        {
            string connectionString = "Data Source=" + ip + ";Persist Security Info=True;Initial Catalog=MACSN数据管理;User ID=sa;Password=sql";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                SqlCommand command = connection.CreateCommand();
                SqlTransaction transaction;

                // Start a local transaction.
                transaction = connection.BeginTransaction("SampleTransaction");

                // Must assign both transaction object and connection
                // to Command object for a pending local transaction
                command.Connection = connection;
                command.Transaction = transaction;
                try
                {
                    int count = oldvalues.Length;
                    switch (dbs)
                    {
                        case DataBaseSelected.MAC1SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC='{0}' where MAC='{1}'",newvalues[i],oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC2SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end where MAC1='{4}' or MAC2='{5}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC3SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end where MAC1='{6}' or MAC2='{7}' or MAC3='{8}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery(); 
                            }
                            break;
                        case DataBaseSelected.MAC4SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end,MAC4=case MAC4 when '{6}' then '{7}'else MAC4 end where MAC1='{8}' or MAC2='{9}' or MAC3='{10}' or MAC4='{11}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery(); 
                            }
                            break;
                        case DataBaseSelected.MAC21SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC='{0}' where MAC='{1}'", newvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC22SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end where MAC1='{4}' or MAC2='{5}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC23SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end where MAC1='{6}' or MAC2='{7}' or MAC3='{8}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC24SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end,MAC4=case MAC4 when '{6}' then '{7}'else MAC4 end where MAC1='{8}' or MAC2='{9}' or MAC3='{10}' or MAC4='{11}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC31SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC='{0}' where MAC='{1}'", newvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC32SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end where MAC1='{4}' or MAC2='{5}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC33SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end where MAC1='{6}' or MAC2='{7}' or MAC3='{8}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        case DataBaseSelected.MAC34SN:
                            for (int i = 0; i < count; i++)
                            {
                                command.CommandText = string.Format("update " + dbs.ToString() + " set MAC1=case MAC1 when '{0}' then '{1}' else MAC1 end,MAC2=case MAC2 when '{2}' then '{3}' else MAC2 end,MAC3=case MAC3 when '{4}' then '{5}' else MAC3 end,MAC4=case MAC4 when '{6}' then '{7}'else MAC4 end where MAC1='{8}' or MAC2='{9}' or MAC3='{10}' or MAC4='{11}'", oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], newvalues[i], oldvalues[i], oldvalues[i], oldvalues[i], oldvalues[i]);
                                command.ExecuteNonQuery();
                            }
                            break;
                        default:
                            break;
                    }
                    
                    transaction.Commit();
                    connection.Close();
                    connection.Dispose();
                }
                catch (Exception ex)
                {
                    connection.Close();
                    connection.Dispose();
                    DevExpress.XtraEditors.XtraMessageBox.Show(ex.Message,"提示");
                }

            }
        }