2014-02-03 2 views
3

Я работаю над заданием школы, которое хочет, чтобы я вставлял некоторые новые значения в таблицу базы данных, а затем печатал сообщение на основе того, был ли успешным INSERT.Синтаксис SQL для проверки того, был ли INSERT успешным?

Вопрос звучит так:

Написать скрипт, который пытается вставить новую категорию под названием «гитара» в таблицу Категории. Если вставка прошла успешно, сценарий должен отображать это сообщение: УСПЕХ: Запись была вставлена.

Если обновление не увенчалось успехом, сценарий должен отображать сообщение что-то вроде этого: FAILURE: Запись не была вставлена. Ошибка 2627: Нарушение ограничения UNIQUE KEY 'UQ_ Категория _8517B2E0A87CE853'. Невозможно вставить дубликат ключа в объект 'dbo.Categories'. Дубликат ключевое значение (гитары).

В настоящее время таблица этих категорий состоит из 2 столбцов: Категории и имя категории. Он заполняется значениями

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 INSERT = успех, ЕСЛИ успех = TRUE, и т.д.), но я «Просто не знаю, как это написать. Я на правильном пути?

EDIT: Я должен упомянуть, я использую SQL Server 2012

+0

Вы используете MySQL или сервер SQL? Это не одно и то же. –

+0

SQL Server 2012, если быть точным – EJF

ответ

4

Я хотел бы использовать попытаться/поймать себя

begin try 
insert query 
print message 
end try 

begin catch 
print message 
end catch 

Вы должны быть в состоянии принять его здесь.

+1

Отличная идея! Это сделал трюк! (и я готов поспорить, это то, что мы должны были сделать в первую очередь, потому что мы просто говорили о попытках/уловах в классе на прошлой неделе) Спасибо, кучка! – EJF

+0

Улов будет печатать нарушение PK, даже если его нет. Необходимо проверить код ошибки! http://msdn.microsoft.com/en-us/library/ms175069.aspx. ERROR_NUMBER() –

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 
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 
Смежные вопросы