1、@@error
@@error函数返回执行的上一个SQL 语句的错误号。当前一个语句遇到错误,则返回错误号,否则返回0。需要注意的是@ERROR在每一条语句执行后会被立刻重置,因此应该在要验证的语句执行后检查数值或者是将它保存到局部变量中以备将来使用。具体的分析请看下面的代码,一目了然。
示例如下:
UPDATE dbo.Product
SET
smallClassID = 90
PRINT @@ERROR
IF @@ERROR=0
BEGIN
 PRINT @@ERROR
END
结果:
消息 547,级别 16,状态 0,第 1 行
UPDATE 语句与 FOREIGN KEY 约束"FK__Product__smallCl__2E1BDC42"冲突。该冲突发生于数据库"Test",表"dbo.ProductClass", column 'ClassID'。
语句已终止。
547
0
分析:上面的更新SQL语句导致主外键冲突,抛出错误信息,所以在执行Update语句后的@@Error数值是547,但是在执行第一个Print @Error语句输出错误信息之后,注意,此时@@Error的数据立即变成了0!,这一点非常重要,因为@@Error在每一条语句执行后立刻被重置!同样的道理,执行IF @@ERROR = 0语句后@@ERROR的数值仍然是0,因为这句话也没有发生错误!
2、@@rowcount
@@rowcount函数返回受上一语句影响的行数。如果行数大于20 亿,请使用 ROWCOUNT_BIG
返回上一语句受影响的行数!和@ERROR一样的特性,在每一条语句执行后都将被重置,如果将来使用需要将变量保存到局部变量中。任何不返回的语句都将这个变量置为0!比如经常使用的IF语句,请看代码。
示例如下:
DECLARE @RowCountVar INT
SELECT * FROM dbo.Product
SET @RowCountVar = @@ROWCOUNT --执行后@@ROWCOUNT为1
IF @@ROWCOUNT = 1 --执行后@@ROWCOUNT为0
BEGIN
    PRINT '影响的行数为1'
    PRINT @@ROWCOUNT
END
IF @RowCountVar <> 0
BEGIN
    PRINT '受影响的行数为:' + STR(@RowCountVar)
END
结果:
(4 行受影响)
影响的行数为1
0
受影响的行数为:         4
分析:
上面的代码中在执行select语句之后,受影响的行数为4行,然后将受影响的行数保存到事先声明的局部变量中,赋值语句实际上影响的行数为1行,在下面的IF语句中进行了跳转,这个地方是关键,这并不是select语句受影响的行数是1,而是将@@ROWCOUNT赋给局部变量的过程中变成了1。在执行后IF @@ROWCOUNT = 1的判断之后@@ROWCOUNT的数值重新被赋值为了0
3、@@identity
@@identity函数返回最后插入数据表中的标识值。在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值。如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL。如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值。
示例如下:
INSERT INTO Product
(
 smallClassID,
 productName,
 productArea,
 price,
 productDate,
 productValidDate,
 remark
)
VALUES
(
 9,
 '123',
 '123',
 2.5,
 GETDATE(),
 GETDATE(),
 '55555'
)
PRINT @@identity
结果:
(1 行受影响)
5
分析:
上面的代码执行Insert之后,受影响的行数为1行,然后打印最后插入数据表中的标识值5.