繁体   English   中英

SQL Server中的OUTPUT子句(Transact-SQL)

[英]OUTPUT Clause in Sql Server (Transact-SQL)

我知道OUTPUT Clause可以在INSERT, UPDATE, DELETE, or MERGE statement INSERT, UPDATE, DELETE, or MERGE statements OUTPUT子句的结果可以存储到target table

但是,当我运行此查询时

select   * from  <Tablename>  output

我没有任何错误。 像select * from tablename一样执行查询,没有任何错误并且编号相同。 行数

那么select语句中output子句的确切用法是什么。 如果有的话如何使用? 我搜索了答案,但找不到答案!!

您问题中的查询与以下错误属于同一类别(我也在该网站上看到过)

SELECT *
FROM   T1 NOLOCK 

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y 

第一个只是以别名T1 AS NOLOCK结尾。 提示的正确语法为(NOLOCK)或理想情况下为WITH(NOLOCK)

第二个别名为T1 AS LOOP。 要请求嵌套循环INNER LOOP JOIN ,语法需要为INNER LOOP JOIN

同样,在您的问题中,它最终只是将OUTPUT的表别名应用于表。

在TSQL中,实际上OUTPUT,LOOP,NOLOCK都不是反向关键字 ,因此将它们用作表别名而不用引用它们是有效的,例如在方括号中。

OUTPUT子句返回有关受语句影响的行的信息。 如前所述, OUTPUT子句与INSERTUPDATEDELETEMERGE语句一起使用。 使用它的原因是因为这些语句本身仅返回受影响的行数,而不返回受影响的行数。 因此,在INSERTUPDATEDELETEMERGE语句中使用OUTPUT可以通过返回实际发生的行来帮助用户。

SELECT语句本身返回行,而SELECT不影响任何行。 因此,不需要或不支持将OUTPUT子句与SELECT一起使用。 如果要将SELECT语句的结果存储到目标表中,请使用SELECT INTO或标准INSERT以及SELECT语句。

编辑

我想我误会了你的问题。 AS @Martin Smith提到它在您提到的SELECT语句中充当别名。

IF OBJECT_ID('tempdelete') IS NOT NULL DROP TABLE tempdelete
GO

IF OBJECT_ID('tempdb..#asd') IS NOT NULL DROP TABLE #asd
GO


CREATE TABLE tempdelete (
    name NVARCHAR(100)
)

INSERT INTO tempdelete VALUES ('a'),('b'),('c')

--Creating empty temp table with the same columns as tempdelete
SELECT * INTO #asd FROM tempdelete WHERE 1 = 0

DELETE FROM tempdelete 
OUTPUT deleted.* INTO #asd

SELECT * FROM #asd

这样可以将所有已删除的记录放入表中。 这样做的问题是,您必须定义具有与要删除的表匹配的所有列的表。 这就是我的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM