РЕДАКТИРОВАТЬ 3: РЕШЕНИЕ Очевидно, у моего кода были проблемы с блоками BEGIN / END, поскольку ответившие пользователи предложили (спасибо!)
Тем не менее, я не мог заставить вас работать, пока я не нашел этопост и попробовал это, если / else структура: с использованием Switch как логика в T-SQL
EDIT2:
Я написал пару PRINT
s в процедуреи значения проходят как раз правильно.Теперь он говорит только «Неверный идентификатор», даже при отправке 200.
220
dsf4
Oct 12 2018 10:10AM
Msg 50000, Level 16, State 1, Procedure p_ValCulture, Line 188
Invalid ID
РЕДАКТИРОВАТЬ: я попытался установить сообщение об ошибке в BEGIN / END;это не сработало.Это код для этой части.
IF @operacion LIKE 'I'
BEGIN
IF @id IS NULL OR @id <= 0
BEGIN
SELECT @errorDesc = 'Invalid ID'
RAISERROR(@errorDesc, 16, 1)
END
IF EXISTS(SELECT 1 FROM Production.Culture AS pc WHERE PC.CultureID = @id)
BEGIN
SELECT @errorDesc = 'ID already exists'
RAISERROR(@errorDesc, 16, 1)
END
END
Я получу это, если выполню хранимую процедуру
Msg 50000, Level 16, State 1, Procedure p_ValCulture4, Line 183
Ниже этого сообщения есть пробел, значение сообщения об ошибкечто я не смог установить.
Вот параметры, которые я передаю:
GO
EXEC p_ValCulture4 200, 'John', '10-12-2018 10:10:10.000','I'
Я использую SQL Server Management 2014, в Windows 64bit.
Я пытаюсь наверстать упущенное на T-SQL, но я не получил достаточно внимания ... но я полностью застрял: / Я проверил Google, Youtube, SO и т. Д .. и перепробовал много вещей, но ничего не работаети я трачу время, застрявшее на этой части, которое я не могу понять.
У меня есть хранимая процедура, которая при отправке «операции» как «I» (char) выполнит вставку в таблицу,Я использую базу данных AdventureWorks2014
на практике.
Проблема заключается в том, что я хочу отправлять различные сообщения об ошибках, если отправленный идентификатор имеет значение null, или другое, если оно уже существует в таблице и т. Д.код процедуры:
CREATE PROCEDURE p_ValCulture4
@id INT,
@name NVARCHAR(50),
@date DATETIME,
@operacion CHAR(1)
AS
BEGIN
print @id
print @name
print @date
SET NOCOUNT ON
DECLARE @errorDesc nvarchar(MAX)
BEGIN TRY
SELECT @operacion = UPPER(@operacion)
IF @operacion = 'I' /* the Insert option */
BEGIN
IF @id IS NULL OR @id <= 0
BEGIN
SELECT @errorDesc = 'Invalid ID'
RAISERROR(@errorDesc, 16, 1)
END
IF EXISTS(SELECT 1 FROM Production.Culture AS pc WHERE PC.CultureID = @id)
BEGIN
SELECT @errorDesc = 'ID already exists'
RAISERROR(@errorDesc, 16, 1)
END
SELECT @errorDesc = 'ERROR: Insert error'
INSERT INTO Production.Culture VALUES
(@id, @name, @date);
SELECT 'Rows: ' + CONVERT(VARCHAR(10),@@ROWCOUNT)
END
END TRY
BEGIN CATCH
RAISERROR (@errorDesc,16,1)
END CATCH
END
Первый IF, если я посылаю id = null, работает нормально, я получаю правильную ошибку;но если я отправлю существующий идентификатор, IF полностью игнорируется.То же самое происходит со вставкой, она работает нормально, но только если в процедуре нет IF.
Я не могу понять, как эти IF - BEGIN / END работают .. и почему это можеттолько читать первый IF, но игнорировать последующие ..
Я пытался поместить все в IF - BEGIN / END, а затем ELSE - BEGIN / END, те же результаты.
У меня естьпопытался установить сообщение об ошибке внутри де IFs, а также снаружи.Кроме того, внутри IFs, но до того, как НАЧАТЬ.Я пытался написать ошибку прямо в RAISERROR, те же результаты.
Если кто-нибудь может помочь мне понять, почему игнорируются IF и логика, лежащая в основе этих IF в T-SQL, было бы очень признательно, очень приятно :)Спасибо!