[英]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
子句与INSERT
, UPDATE
, DELETE
或MERGE
语句一起使用。 使用它的原因是因为这些语句本身仅返回受影响的行数,而不返回受影响的行数。 因此,在INSERT
, UPDATE
, DELETE
或MERGE
语句中使用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.