我知道OUTPUT Clause
可以使用INSERT, UPDATE, DELETE, or MERGE statement
。 OUTPUT
中的INSERT, UPDATE, DELETE, or MERGE statements
子句的结果可以存储到target table
中。
但是,当我运行此查询时
select * from <Tablename> output
我没有收到任何错误。执行的查询类似于select * from tablename,没有任何错误,并且具有相同的no。行
那么select语句中output子句的确切用法是什么。如果有的话怎么用呢? 我搜索了答案,但我找不到答案!!
答案 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
条款与INSERT
,UPDATE
,DELETE
或MERGE
语句一起使用。它被使用的原因是因为这些语句本身只返回受影响的行而不受影响的行数。因此,OUTPUT
与INSERT
,UPDATE
,DELETE
或MERGE
语句的使用有助于用户返回实际的行。
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
这是您可以将所有已删除的记录放入表中的方法。问题在于您必须使用与要删除的表匹配的所有列来定义表。我就是这样做的。