Tsql sql server中打印@@ROWCOUNT和输出$ACTION之间的差异

Tsql sql server中打印@@ROWCOUNT和输出$ACTION之间的差异,tsql,sql-server-2008,Tsql,Sql Server 2008,如果我的问题看起来很幼稚,我道歉: 我无法理解以下两种说法,有人能解释一下区别吗: OUTPUT $ACTION, INSERTED.BuildRequestID, ..... and PRINT @@ROWCOUNT 显然,它们都可以用于在窗口上打印某些内容,在上面的示例中,通过输出,将显示已插入的记录。并且,PRINT@@ROWCOUNT返回批处理中受最后执行语句影响的行数,因此,如果函数是insert,那么它将显示插入的记录 谢谢,用最简单的术语来说,它将为您提供受DML语句影响的实际记

如果我的问题看起来很幼稚,我道歉: 我无法理解以下两种说法,有人能解释一下区别吗:

OUTPUT $ACTION, INSERTED.BuildRequestID, ..... and
PRINT @@ROWCOUNT
显然,它们都可以用于在窗口上打印某些内容,在上面的示例中,通过输出,将显示已插入的记录。并且,PRINT@@ROWCOUNT返回批处理中受最后执行语句影响的行数,因此,如果函数是insert,那么它将显示插入的记录

谢谢,

用最简单的术语来说,它将为您提供受DML语句影响的实际记录(INSERT、UPDATE、DELETE、MERGE),只会告诉您有多少行受上一条语句影响(不限于DML)

这可能是最容易理解的一个工作示例,您可以自己运行并查看这两个示例:

IF OBJECT_ID(N'tempdb..#T', 'U') IS NOT NULL
    DROP TABLE #T;

-- CHECK @@ROWCOUNT
DECLARE @RowCountFromDropTable INT = @@ROWCOUNT;

-- CREATE A TABLE
CREATE TABLE #T (ID INT NOT NULL PRIMARY KEY, Col CHAR(1) NOT NULL);

-- INSERT SOME VALUES AND CHECK THE OUTPUT
INSERT #T (ID, Col) 
OUTPUT inserted.*
VALUES (1, 'A'), (2, 'B'), (3, 'C');

-- CHECK @@ROWCOUNT
DECLARE @RowCountFromInsert INT = @@ROWCOUNT;

-- DELETE A VALUE AND INSPECT THE DELETED RECORD WITH OUTPUT
DELETE  #T
OUTPUT deleted.*
WHERE   ID = 3;

-- CHECK @@ROWCOUNT
DECLARE @RowCountFromDelete INT = @@ROWCOUNT;

-- UPDATE A RECORD AND VIEW BEFORE AND AFTER VALUES
UPDATE  #T
SET     Col = 'X'
OUTPUT inserted.ID AS ID, 
        inserted.Col AS UpdatedTo, 
        deleted.Col AS UpdatedFrom
WHERE   ID = 2;

-- CHECK @@ROWCOUNT
DECLARE @RowCountFromUpdate INT = @@ROWCOUNT;

-- USE MERGE, AND CAPTURE ACTION:
MERGE #T AS t
USING (VALUES (2, 'B'), (3, 'C')) AS s (ID, Col)
    ON s.ID = t.ID
WHEN NOT MATCHED THEN INSERT (ID, Col) VALUES (s.ID, s.Col)
WHEN MATCHED THEN UPDATE SET Col = s.Col
WHEN NOT MATCHED BY SOURCE THEN DELETE
    OUTPUT $Action AS DMLAction, 
            inserted.ID AS InsertedID, 
            inserted.Col AS InsertedCol, 
            deleted.ID AS DeletedID, 
            deleted.Col AS DeletedCol;

-- CHECK @@ROWCOUNT
DECLARE @RowCountFromMerge INT = @@ROWCOUNT;

SELECT  RowCountFromDropTable = @RowCountFromDropTable,
        RowCountFromInsert = @RowCountFromInsert,
        RowCountFromDelete = @RowCountFromDelete,
        RowCountFromUpdate = @RowCountFromUpdate,
        RowCountFromMerge = @RowCountFromMerge;
每个DML输出的记录集为:

插入

ID  Col
-------
1   A
2   B
3   C
删除

ID  Col
-------
3   C
ID  UpdatedTo   UpdatedFrom
---------------------------
2       X           B
DMLAction   InsertedID  InsertedCol DeletedID   DeletedCol
------------------------------------------------------------
INSERT          3           C           NULL        NULL
DELETE          NULL        NULL        1           A
UPDATE          2           B           2           X
更新

ID  Col
-------
3   C
ID  UpdatedTo   UpdatedFrom
---------------------------
2       X           B
DMLAction   InsertedID  InsertedCol DeletedID   DeletedCol
------------------------------------------------------------
INSERT          3           C           NULL        NULL
DELETE          NULL        NULL        1           A
UPDATE          2           B           2           X
合并

ID  Col
-------
3   C
ID  UpdatedTo   UpdatedFrom
---------------------------
2       X           B
DMLAction   InsertedID  InsertedCol DeletedID   DeletedCol
------------------------------------------------------------
INSERT          3           C           NULL        NULL
DELETE          NULL        NULL        1           A
UPDATE          2           B           2           X
检查@@ROWCOUNTS

RowCountFromDropTable   RowCountFromInsert  RowCountFromUpdate  RowCountFromMerge
--------------------------------------------------------------------------------
        0                       3                   1                   3
qeustion中的一些措辞也有一个简短的要点:您不能直接使用
OUTPUT
将内容打印到窗口,它返回的记录与
SELECT
语句非常相似
@@ROWCOUNT
可以像任何标量函数一样使用,因此您可以在连续语句中使用它。所以你可以这样做:

SELECT  TOP (1) *
FROM    (VALUES (1), (2), (3)) AS t (ID);

SELECT  TOP (@@ROWCOUNT + 1) *
FROM    (VALUES (1), (2), (3)) AS t (ID);

SELECT  TOP (@@ROWCOUNT + 1) *
FROM    (VALUES (1), (2), (3)) AS t (ID);

它分别返回
1
1,2
1,2,3
。我不知道您为什么要这样做,但它比上述内容更好地演示了
@@ROWCOUNT
的范围,以及如何在其他地方使用它。

这两行之间没有任何共同之处,因此很难区分它们的不同之处。它们完全不同,也不相关。@GSerg,你能解释两个用例的区别吗?我非常感谢你抽出时间来给出这个非常全面的答案,你所询问的
$ACTION
语法只适用于
合并
语句,并且在Gareth已经向您指出的
OUTPUT
子句的文档中有详细说明。