用于检查INSERT是否成功的SQL语法?

时间:2014-02-03 23:20:10

标签: sql sql-server database insert sql-server-2012

我正在开展一项学校作业,希望我将一些新值插入数据库表,然后根据INSERT是否成功打印一条消息。

问题是这样的:

  

编写一个试图插入名为“Guitars”的新类别的脚本   进入Categories表。如果插入成功,则为脚本   应显示以下消息:SUCCESS:已插入记录。

     

如果更新失败,脚本应显示一条消息   像这样:FAILURE:没有插入记录。错误2627:   违反UNIQUE KEY约束'UQ_ Categori _8517B2E0A87CE853'。   无法在对象'dbo.Categories'中插入重复键。重复   关键值是(吉他)。

目前,此Categories表包含2列:CategoryID和Category name。它填充了值

1     Guitars
2     Basses
3     Drums
4     Keyboards 

显然,问题要求你插入的吉他类别已经存在,所以我猜这个问题的重点是让它打印错误信息。问题的逻辑似乎相当简单;将吉他类别插入表格中。如果插入成功,则打印这样的。如果不成功,请打印出某某。我只是不确定语法。这是我到目前为止所获得的SQL代码:

USE MyGuitarShop;

INSERT INTO Categories (CategoryID, CategoryName)
VALUES (5, 'Guitars')

IF (          ) --insert is successful
    PRINT 'SUCCESS: Record was inserted'
ELSE --if insert is unsuccessful
    PRINT 'FAILURE: Record was not inserted.'
    PRINT 'Error 2627: Violation of UNIQUE KEY constraint 'UQ__Categori__8517B2E0A87CE853'.' 
    PRINT 'Cannot insert duplicate key in object 'dbo.Categories'. The duplicate key value is (Guitars).'

我觉得IF语句中有某种布尔方程式(IF INSERT =成功,IF成功= TRUE等),但我只是不确定如何编写它。我是在正确的轨道上吗?

编辑:我应该提一下我正在使用SQL Server 2012

4 个答案:

答案 0 :(得分:4)

我会自己使用try / catch

begin try
insert query
print message
end try

begin catch
print message
end catch

你应该可以从这里拿走它。

答案 1 :(得分:1)

USE MyGuitarShop
GO

BEGIN TRY
    -- Insert the data
    INSERT INTO Categories (CategoryName)
    VALUES ('Guitars')
    PRINT 'SUCCESS: Record was inserted.'
END TRY
BEGIN CATCH
    PRINT 'FAILURE: Record was not inserted.';
    PRINT 'Error ' + CONVERT(VARCHAR, ERROR_NUMBER(), 1) + ': '+ ERROR_MESSAGE()
END CATCH
GO

答案 2 :(得分:0)

如果您的代码返回错误代码,您可以检查@@ ROWCOUNT以查看插入的ROWS数量或@@ ERROR。

这里有一些关于此的内容:

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/11960c24-cad7-4f06-ae6c-219e46d555a0/how-to-know-if-insertion-is-successful-?forum=transactsql

http://www.sommarskog.se/error-handling-II.html

答案 3 :(得分:0)

有两类错误处理。

使用@@ ERROR系统变量检查错误。使用BEGIN / END TRY和BEGIN / END CATCH。

此外,RAISERROR或THROW语句可用于特定于业务规则的错误。

查看我关于该主题的四篇博客文章。大量的代码。

http://craftydba.com/?tag=error-handling

我使用你用IF ELSE开始的初始算法对此进行了编码。

-- Select the old database
USE MyGuitarShop;
go

-- Grab error value
DECLARE @ERR INT = 0;

-- Insert the data
INSERT INTO Categories 
  (CategoryID, CategoryName)
VALUES 
  (5, 'Guitars');

-- Simple error handling
SET @ERR = @@ERROR;
IF (@ERR = 0)
  BEGIN
    PRINT 'SUCCESS: Record was inserted';
  END
ELSE IF (@ERR = 2627)
  BEGIN
    PRINT 'FAILURE: Record was not inserted.';
    PRINT 'Error 2627: Violation of UNIQUE KEY constraint ''UQ__Categori__8517B2E0A87CE853''.' ;
    PRINT 'Cannot insert duplicate key in object ''dbo.Categories''. The duplicate key value ';
  END
ELSE
  BEGIN
    PRINT 'FAILURE: Record was not inserted.';
    PRINT 'Error ' + STR(@ERR, 6, 0) + ' was not gracefully handled';
  END
GO