Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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中使用OUTPUT子句更新查询_Sql_Sql Server_Tsql - Fatal编程技术网

在SQL Server中使用OUTPUT子句更新查询

在SQL Server中使用OUTPUT子句更新查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试编写一个查询,该查询将从上次执行时添加或更改的表中选择所有行 我有一个带有datetime字段timechg的表tbl,当插入行并每次更新时,它被设置为getdate。最后一次执行我的查询的时刻存储在ts字段中的1行表lastrun中。该查询应该返回数据并同时将ts字段设置为getdate。这就是我想到的: UPDATE lr SET lr.ts = getdate() OUTPUT t.* FROM lastrun lr INNER JOIN tbl t ON

我正在尝试编写一个查询,该查询将从上次执行时添加或更改的表中选择所有行

我有一个带有datetime字段timechg的表tbl,当插入行并每次更新时,它被设置为getdate。最后一次执行我的查询的时刻存储在ts字段中的1行表lastrun中。该查询应该返回数据并同时将ts字段设置为getdate。这就是我想到的:

UPDATE lr
   SET lr.ts = getdate()
OUTPUT t.*
  FROM lastrun lr
       INNER JOIN tbl t ON lr.ts < t.timechg
返回正确的数据集


我做错了什么?

有些事情不对劲。我没有看到用于处理结果的into或select查询。或查询以查看值是什么。我希望:

-- Create an empty table to hold the results
create table #t as
    select lastrun.*
    from lastrun
    where 1 = 0;

UPDATE lr
   SET lr.ts = getdate()
   OUTPUT t.* INTO #t
   FROM lastrun lr JOIN
        tbl t
        ON lr.ts < t.timechg;

SELECT * FROM #t;

检查下面的示例代码,了解在UPDATE查询期间如何使用OUTPUT子句

if object_id('tempdb..#temp') is not null
drop table #temp

if object_id('tempdb..#Inserted') is not null
drop table #Inserted

create table #temp
(
id int,
ts datetime
)

insert into #temp
values (1,'2018-01-01 20:29:58.507')

--select * from #temp;

CREATE TABLE #Inserted
(   [inserted_ts] datetime,
    [deleted_ts] datetime,
)

update #temp 
set 
ts='2019-10-02 20:29:58.507' 
output deleted.ts AS [deleted_ts],inserted.ts AS [inserted_ts]
    INTO #Inserted
where id=1

--select * from #temp
select * from #Inserted

为什么要从tbl输出值,而tbl甚至不是要插入的表?通常情况下,您会输出插入和/或删除的值。您运气不好。为了从一个不更新的表中输出,您必须使用merge语句。如果您希望在输出中有多行,那么您的更新一开始就不正确,因为您将不确定地多次更新一行。即使您每次都使用相同的值,这仍然是一个禁忌。您很幸运,因为引擎会在更新之前消除重复数据,但这也意味着您的输出不会给出多行数据。@GeorgeMenoutis no-luck->MERGE语句多次尝试更新或删除同一行。当目标行与多个源行匹配时,会发生这种情况。MERGE语句不能多次更新/删除目标表的同一行。优化ON子句以确保目标行最多与一个源行匹配,或使用GROUP BY子句对源行进行分组。开始事务、使用UPDLOCK选择、在lr上保持锁定、更新、提交。我非常确定,如果不是100%确定,您不能在SQL Server上的一条语句中填充所有这些内容。OUTPUT子句并不总是需要INTO子句。@Sami。是的,但是如果是这样的话,语句中应该有一个insert。
if object_id('tempdb..#temp') is not null
drop table #temp

if object_id('tempdb..#Inserted') is not null
drop table #Inserted

create table #temp
(
id int,
ts datetime
)

insert into #temp
values (1,'2018-01-01 20:29:58.507')

--select * from #temp;

CREATE TABLE #Inserted
(   [inserted_ts] datetime,
    [deleted_ts] datetime,
)

update #temp 
set 
ts='2019-10-02 20:29:58.507' 
output deleted.ts AS [deleted_ts],inserted.ts AS [inserted_ts]
    INTO #Inserted
where id=1

--select * from #temp
select * from #Inserted