Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:动态更新多行_Sql_Sql Server_Sql Server 2005_Stored Procedures_Sql Update - Fatal编程技术网

SQL Server:动态更新多行

SQL Server:动态更新多行,sql,sql-server,sql-server-2005,stored-procedures,sql-update,Sql,Sql Server,Sql Server 2005,Stored Procedures,Sql Update,我想更新数据库中的多行,值可能不同。想象一下这张桌子: Username FirstName LastName ------------------------------- user1 John Doe user2 Jane Doe user3 bill gates 如果要更新表,使其看起来像这样: Username FirstName LastName ----------------------

我想更新数据库中的多行,值可能不同。想象一下这张桌子:

Username   FirstName   LastName 
-------------------------------
user1      John        Doe 
user2      Jane        Doe
user3      bill        gates
如果要更新表,使其看起来像这样:

Username   FirstName   LastName 
-------------------------------
user1      John        Deer 
user2      Jane        Farmer
user3      Gill        Bates
是否最好为每个用户使用一条
UPDATE
语句?或者一个查询就可以做到这一点吗

还可以将其放在存储过程中并提供一组值吗

第二个问题,在进行更新之前,是否最好检查值是否已更改?或者只是更新所有人,即使值相同

如果相关的话,我目前正在使用SQL Server 2005和C#作为应用程序。

您可以试试这个

declare @TempTable1 table (UserName nvarchar(128) primary key, FirstName nvarchar(128), LastName(128))

insert into @TempTable1
select 'user1', 'John', 'Deer' union all
select 'user2', 'Jane', 'Farmer' union all
select 'user3', 'Gill', 'Bate'

update table1 set
    FirstName = t2.FirstName,
    LastName = t2.LastName
from table1 as t
    inner join @TempTable1 as t2 on t2.UserName = t.UserName
或者,如果只想更新已更改的字段

update table1 set
    FirstName = isnull(t2.FirstName, t.FirstName),
    LastName = isnull(t2.LastName, t.LastName)
from table1 as t
    inner join @TempTable1 as t2 on t2.UserName = t.UserName
对于C#客户端应用程序,我认为通常的方法是创建过程

create procedure sp_Table1_Update
(
    @UserName nvarchar(128),
    @FirstName nvarchar(128),
    @LastName nvarchar(128)
)
as
begin
    update table1 set
        FirstName = @FirstName,
        LastName = @LastName
    where UserName = @UserName
end

然后从应用程序中为每个用户调用它

我会为每个用户创建单独的查询:

UPDATE Table1 SET FirstName = 'John', 'LastName = 'Doe' WHERE FirstName = 'John' 
    AND 'LastName = 'Deer' AND 'UserName = 'user1'
等等


您有唯一的用户名,因此理论上不需要更新未更改的值。但是,作为额外的安全预防措施,您始终可以将其内置。

我已经创建了这个查询,但这只是实际表的一个示例。大约有30万行。因此,我的问题是,从性能角度来看,最好在执行和更新之前检查行是否已更改,或者在考虑到行的先前值之后,现在更新行是否更快。如果您需要性能,那么提前检查是否要更新列eneds将是一个好主意。然后,我会动态地做一些事情,编写一个通用的update语句,并对列执行检查。如果需要更新,请将该列附加到语句中,否则跳过它。好的,我现在基本上就是这么做的。我想知道是否可以为多个用户运行一个查询,以及最好的方式是什么。为每个用户运行一个查询对我来说是最简单的,但我不确定什么是性能最好的。我只是想这样运行,现在看起来最简单。稍后,如果性能不好,我可以进行一些评测。@LasseVabeRolstad好吧,这取决于您希望一次更新多少用户。如果您有超过百行要从客户机更新(对我来说有点奇怪),您可能会考虑使用XML来更新所有行的一个参数,而技术上可以将其变成一个查询,您将有一个疯狂的WHERE子句或CASE逻辑来应对。当您有1个条件应用于多个值时,批量更新是最好的。。。例如,如果您希望将所有的名字和姓氏更新为正确的大小写,或者如果您需要将某些姓氏更改为等于另一列的值,则最好在多行上使用update语句。