Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 Update语句以更新多行_Sql Server_Sql Update - Fatal编程技术网

Sql server Update语句以更新多行

Sql server Update语句以更新多行,sql-server,sql-update,Sql Server,Sql Update,我有一个关于以下语法的问题。有没有一种更干净的方法将其汇总为一个语句而不是两个语句。我尝试了多次迭代,但这似乎是我成功执行这两条语句的唯一方法 UPDATE employee SET hire_date = '1979-03-15' WHERE emp_id = 'PMA42628M' UPDATE employee SET hire_date = '1988-12-22' where emp_id = 'PSA89086M'; 我也尝试过这个,我也尝试过使用and语句。两者都不起作用。

我有一个关于以下语法的问题。有没有一种更干净的方法将其汇总为一个语句而不是两个语句。我尝试了多次迭代,但这似乎是我成功执行这两条语句的唯一方法

UPDATE employee
SET hire_date = '1979-03-15'
WHERE emp_id = 'PMA42628M' 

UPDATE employee
SET hire_date = '1988-12-22'
where emp_id = 'PSA89086M'; 
我也尝试过这个,我也尝试过使用and语句。两者都不起作用。基本上,我是在寻找一种不那么新手的方法,然后是上面的方法,如果有的话。我花了很长时间寻找,但没有找到

UPDATE employee
SET hire_date = ('1979-03-15', '1988-12-22')
WHERE emp_id = ('PMA42628M', 'PSA89086M');
如果您对此有任何建议,顺便说一句,我正在使用sql server。
感谢您尝试此选项,这将组合多个选择并返回它们,就像它们来自数据库一样:

UPDATE e
SET hire_date = t.hire_date
FROM dbo.employee e
JOIN (
    SELECT emp_id = 'PMA42628M', hire_date = '1979-03-15'
    UNION ALL
    SELECT emp_id = 'PSA89086M', hire_date = '1988-12-22'
) t ON t.emp_id = e.emp_id
如果您使用的是SQL Server 2008或更高版本,还可以对派生表使用不同的语法:

UPDATE e
SET hire_date = t.hire_date
FROM dbo.employee e
JOIN (
    VALUES
        ('PMA42628M', '1979-03-15'),
        ('PSA89086M', '1988-12-22')
) t (emp_id, hire_date) ON t.emp_id = e.emp_id
我正在寻找一种不那么新手的方式

按照我的说法,做两个单独的更新语句是“不太新手的方式”,你可以把事情复杂化,然后做类似的事情

update employee
set hire_date = case emp_id
                  when 'PMA42628M' then '1979-03-15'
                  when 'PSA89086M' then '1988-12-22'
                end
where emp_id in ('PMA42628M', 'PSA89086M')

但这会给你带来什么好处呢?整个更新将在一个隐式事务中运行,因此如果希望两个更新在一个事务中,只需使用
begintransaction。。。。提交

您可以创建一个临时表或一个包含要执行的更新的表变量,然后运行
UPDATE
语句,将表链接到要更新的表

请注意,对于两个更新,您会得到两条语句:将
INSERT
插入更新表和
update
语句本身。不过,对于需要执行的更新,语句的数量仍然是两个

CREATE TABLE #employee (emp_id VARCHAR(9) NOT NULL PRIMARY KEY,hire_date DATE NOT NULL);
INSERT INTO #employee (emp_id,hire_date)
VALUES ('PMA42628M','2013-06-05'),('PSA89086M','2013-06-05');

CREATE TABLE #target_updates(emp_id VARCHAR(9) NOT NULL,hire_date DATE NOT NULL);
INSERT INTO #target_updates (emp_id,hire_date)
VALUES ('PMA42628M','1979-03-15'),('PSA89086M','1988-12-22');

更新表\u name set='value',其中orgid in(idnum1,idnum2)

关键字
AS
不是丢失了两次吗?在这种情况下,我不使用
AS
关键字,因为它是不必要的。关键字
AS
不是必需的,但为了更好的可读性,我们鼓励它。@TT,这是个人的偏好。:)@TT..........但经常在Oracle和非Oracle之间切换的人可能会感到气馁。(Oracle不支持表别名声明之前的
AS
:,)我最终回答了这个问题,因为我在谷歌上搜索一种方法来优化一个缓慢(交互式)的应用程序,该应用程序在一分钟内执行大约100K条更新语句。切换到类似建议的组合变型给了我们大约700%的加速,所以我们现在在不到10秒内完成同样的工作。把它全部放在一个事务中并没有帮助,因为它是所有SQL语句的分派和往返时间,占用了大部分时间。这个shd是公认的答案,因为它也适用于从一个已经存在的表中更新n行数
UPDATE
    #employee
SET
    hire_date=tu.hire_date
FROM
    #employee AS e
    INNER JOIN #target_updates AS tu ON
        tu.emp_id=e.emp_id;

SELECT
    *
FROM
    #employee
ORDER BY
    emp_id;
DROP TABLE #target_updates;
DROP TABLE #employee;