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

时间:2014-10-14 04:19:00

标签: sql sql-server sql-server-2008 tsql

我知道OUTPUT Clause可以使用INSERT, UPDATE, DELETE, or MERGE statementOUTPUT中的INSERT, UPDATE, DELETE, or MERGE statements子句的结果可以存储到target table中。

但是,当我运行此查询时

select   * from  <Tablename>  output

我没有收到任何错误。执行的查询类似于select * from tablename,没有任何错误,并且具有相同的no。行

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

3 个答案:

答案 0 :(得分:2)

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

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

同样在您的问题中,它最终会将OUTPUT的表别名应用到您的表格中。

在TSQL中,OUTPUT,LOOP,NOLOCK都不是reversed keywords,因此将它们用作表别名是有效的,无需引用它们,例如在方括号中。

答案 1 :(得分:1)

OUTPUT子句返回有关受语句影响的行的信息。如您所述,OUTPUT条款与INSERTUPDATEDELETEMERGE语句一起使用。它被使用的原因是因为这些语句本身只返回受影响的行而不受影响的行数。因此,OUTPUTINSERTUPDATEDELETEMERGE语句的使用有助于用户返回实际的行。

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

修改

我想我误解了你的问题。 AS @Martin Smith提到它在你提到的SELECT语句中扮演别名。

答案 2 :(得分:0)

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

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