输出条款解释

7 t-sql sql-server

有人可以向我解释SQL Server输出子句吗?我已经阅读了MSDN文章,我仍然对此感到困惑.谢谢.

Mar*_*ith 8

举几个例子有帮助吗?下面的所有输出结果到客户端,但你也可以OUTPUT INTO一个@table_variable(或在某些条件标准表)

create table T
(
id int identity(1,1),
c char(1)
)

insert into T(c) 
OUTPUT inserted.* /*Output Inserted Rows - shows the ids that were allocated*/
values ('A'),('B'),('C')
Run Code Online (Sandbox Code Playgroud)

返回

id          c
----------- ----
1           A
2           B
3           C
Run Code Online (Sandbox Code Playgroud)

.

UPDATE T
SET c = CHAR(ASCII(c)+1)
 /*Output before and after versions of each row*/
OUTPUT deleted.*, inserted.*
WHERE id IN (2,3)
Run Code Online (Sandbox Code Playgroud)

返回

id          c    id          c
----------- ---- ----------- ----
2           B    2           C
3           C    3           D
Run Code Online (Sandbox Code Playgroud)

.

DELETE 
FROM T
 /*Output the row(s) that were deleted*/
OUTPUT deleted.*
WHERE DATEPART(second, getdate())%id = 0
Run Code Online (Sandbox Code Playgroud)

退货(例如)

id          c
----------- ----
1           A
Run Code Online (Sandbox Code Playgroud)

编辑:

在回复评论时,一些示例显示了如何OUTPUT用于插入表.

CREATE TABLE #T2
(
id UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(),
c CHAR(1)
)

DECLARE @inserted TABLE
(
id UNIQUEIDENTIFIER,
c CHAR(1)
)

INSERT INTO #T2(c) 
OUTPUT inserted.id, inserted.c 
INTO @inserted
VALUES ('A')
Run Code Online (Sandbox Code Playgroud)

如果您使用的是SQL Server 2008,则可以使用可组合的DML

INSERT INTO @inserted
SELECT I.id, I.c
FROM 
    (
    INSERT INTO #T2(c) 
    OUTPUT inserted.id, inserted.c 
    VALUES ('B'),('C')
    ) AS I
WHERE c <> 'C' --Only add rows of interest to @inserted table
Run Code Online (Sandbox Code Playgroud)

但是如果插入目标参与PK/FK关系,您将收到错误消息.如果遇到此问题,您也可以使用此模式.

INSERT INTO @inserted
EXEC sp_executesql N'
    INSERT INTO #T2(c) 
    OUTPUT inserted.id, inserted.c 
    VALUES (''D''),(''E'') '
Run Code Online (Sandbox Code Playgroud)