输出条款解释

时间:2011-02-27 17:28:55

标签: sql-server tsql

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

3 个答案:

答案 0 :(得分: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')

返回

id          c
----------- ----
1           A
2           B
3           C

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

返回

id          c    id          c
----------- ---- ----------- ----
2           B    2           C
3           C    3           D

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

返回(例如)

id          c
----------- ----
1           A

编辑:

回应一些示例,说明如何使用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')

如果您使用的是SQL Server 2008,则可以use composable 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

但是如果插入目标参与PK / FK关系,您将收到错误消息。 If you encounter this problem you can also use this pattern

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

答案 1 :(得分:1)

可以说是

  

如何找出删除,插入或更新的行?

您可以使用一些花哨的触发器代码或单独的SELECT,但OUTPUT子句可以轻松实现。 SELECT成为实际DELETE,INSERT或UPDATE

的一部分

答案 2 :(得分:0)

OUTPUT子句允许您将INSERTUPDATESELECT合并。

您可以OUTPUT一个字段列表,查询将为受INSERT / UPDATE影响的每一行返回一行。