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
子句的文档中有详细说明。