26

我有一个将值插入表的过程。

declare @fName varchar(50),@lName varchar(50),@check tinyint
INSERT INTO myTbl(fName,lName) values(@fName,@lName)

编辑:

现在我想检查它是否插入成功 set @check = 0 else @check = 1

4

4 回答 4

43

您可以@@ROWCOUNT在插入查询后立即使用服务器变量来检查插入操作受影响的行数。

declare @fName varchar(50) = 'Abcd',
        @lName varchar(50) = 'Efgh'
INSERT INTO myTbl(fName,lName) values(@fName,@lName)

PRINT @@ROWCOUNT --> 0- means no rows affected/nothing inserted 
                 --> 1- means your row has been inserted successfully 

根据您的要求,您可以使用Case声明(根据评论):

--If you need @check as a bit type please change Int to bit
DECLARE @check Int = CASE WHEN @@ROWCOUNT = 0 THEN 1 ELSE 0 END
于 2013-10-15T07:35:23.930 回答
6

您需要使用@@ROWCOUNT

它返回受最后一条语句影响的行数。如果行数超过 20 亿,请使用ROWCOUNT_BIG.

@@ROWCOUNT 是范围和连接安全的。

事实上,它只读取该连接和范围的最后一条语句行数。

即使在基表上有触发器时,在 SQL Server 中使用 @@ROWCOUNT 也是安全的。触发器不会扭曲您的结果;你会得到你所期望的。即使设置了 NOCOUNT,@@ROWCOUNT 也能正常工作。

所以你的查询应该是:

declare @fName varchar(50), @lName varchar(50), @check tinyint = 0
...
INSERT INTO myTbl(fName,lName) values(@fName,@lName)
if  @@ROWCOUNT>0   
  set @check = 1
于 2013-10-15T07:38:16.950 回答
2

您可以@@rowcount在插入表之后使用,如下所示:

DECLARE @check int

INSERT INTO Employees (Name,Email,Phone,[Address])
VALUES('Test','test@mail.com','','')

if(@@ROWCOUNT>0)
SET @check=1

SELECT @check;
于 2019-10-14T12:52:19.357 回答
1

在 SQL-Sever 中,您可以使用 OUTPUT 子句检查值是否成功插入。通过以下查询

 
declare @fName varchar(50),@lName varchar(50)

INSERT INTO myTbl(fName,lName) OUTPUT inserted.* values(@fName,@lName)  ;

 

如果插入了值,它将显示插入值的输出。您还可以将这些值存储到新表中。

于 2013-10-15T07:42:45.740 回答