2013-10-11 3 views
1

У меня есть следующая хранимая процедура, и я хотел бы вернуть фактическую ошибку SQL Server, а не мое сообщение, как это можно сделать?Поднять реальную ошибку SQL из хранимой процедуры?

Я в настоящее время использую RAISERROR и покажу сообщение, но я бы хотел вернуть фактическую ошибку SQL.

Благодаря

ALTER PROCEDURE [dbo].[sp_DBA_DROPFIELD] 
(
    @fieldDisplayName varchar(max), 
    @tableSeq int, 
    @viewName varchar(max), 
    @isVirtual varchar(4) 
) 
AS 
    DECLARE 
    @sql_table_name varchar(max), 
    @sql_fieldname varchar(max), 
    @sql_columnName varchar(max), 
    @sql_fieldSeq int, 
    @sql_SEQ_FKTABLE int, 
    @sql_FKTABLENAME varchar(max), 
    @sql_EXEC_DROPCONSTRAINT varchar(max), 
    @sql_EXEC_DROPCOLUMN varchar(max), 
    @sql_EXEC_DELETEVIRTUAL varchar(max), 
    @sql_EXEC_DELETEFIELDREF int 
BEGIN TRAN 
BEGIN TRY 
select @sql_table_name = TABLENAME from SD_TABLES where SEQUENCE = + @tableSeq 
select @sql_columnName = COLUMN_NAME, @sql_fieldSeq = SEQUENCE, @sql_SEQ_FKTABLE = FK_TABLE from SD_FIELDS where DISPLAY_NAME = @fieldDisplayName AND SEQ_TABLE = @tableSeq 

if @sql_SEQ_FKTABLE IS NOT NULL 
BEGIN 
Select @sql_FKTABLENAME = TABLENAME from SD_TABLES where SEQUENCE = @sql_SEQ_FKTABLE 
SET @sql_EXEC_DROPCONSTRAINT = 'ALTER TABLE ' + @sql_table_name + ' DROP CONSTRAINT [FK__' + @sql_table_name + '___' + @sql_FKTABLENAME + '_]' 
SET @sql_EXEC_DROPCOLUMN = 'ALTER TABLE ' + @sql_table_name + ' DROP COLUMN ' + @sql_columnName 
EXEC sp_executesql @sql_EXEC_DROPCONSTRAINT 
EXEC sp_executesql @sql_EXEC_DROPCOLUMN 
END 

if @isVirtual = 'true' 
BEGIN 
SET @sql_EXEC_DELETEVIRTUAL = 'ALTER TABLE ' + @sql_table_name + ' DROP COLUMN ' + @sql_columnName 
EXEC sp_executesql @sql_EXEC_DELETEVIRTUAL 
END 

SET @sql_EXEC_DELETEFIELDREF = 'DELETE FROM SD_FIELDS WHERE SEQUENCE = ' + @sql_fieldSeq 
EXEC sp_executesql @sql_EXEC_DELETEFIELDREF 

COMMIT 

END TRY 

BEGIN CATCH 
    ROLLBACK TRAN 
    RAISERROR('An error has occured, no changes have been made', 5, 1) 
END CATCH   
+5

Side Примечание: вы должны ** не * * используйте префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

спасибо, Марк, да, я помню это сейчас. Я изменю его. Вы действительно ответили на мой вопрос, поскольку я не могу видеть его в редактировании. Спасибо – realtek

+0

Какую ** версию ** SQL Server вы используете? В версии 2012 года есть новая функциональность, которая упростит это ... –

ответ

0

Я совет вам создать эту хранимую процедуру:

CREATE PROCEDURE [dbo].[RethrowError] 
AS 
-- Return if there is no error information to retrieve. 
IF ERROR_NUMBER() IS NULL 
    RETURN; 

DECLARE 
    @ErrorMessage NVARCHAR(4000), 
    @ErrorNumber  INT, 
    @ErrorSeverity INT, 
    @ErrorState  INT, 
    @ErrorLine  INT, 
    @ErrorProcedure NVARCHAR(200); 

-- Assign variables to error-handling functions that 
-- capture information for RAISERROR. 
SELECT 
    @ErrorNumber = ERROR_NUMBER(), 
    @ErrorSeverity = ERROR_SEVERITY(), 
    @ErrorState = ERROR_STATE(), 
    @ErrorLine = ERROR_LINE(), 
    @ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-'); 

-- Build the message string that will contain original 
-- error information. 
SELECT @ErrorMessage = 
    N'Error %d, Level %d, State %d, Procedure %s, Line %d, ' + 
     'Message: '+ ERROR_MESSAGE(); 

-- Raise an error: msg_str parameter of RAISERROR will contain 
-- the original error information. 
RAISERROR 
    (
    @ErrorMessage, 
    @ErrorSeverity, 
    1,    
    @ErrorNumber, -- parameter: original error number. 
    @ErrorSeverity, -- parameter: original error severity. 
    @ErrorState,  -- parameter: original error state. 
    @ErrorProcedure, -- parameter: original error procedure name. 
    @ErrorLine  -- parameter: original error line number. 
    ); 

И затем использовать его как это:

BEGIN CATCH 
    ROLLBACK TRAN 
    EXEC dbo.RethrowError 
END CATCH 
Смежные вопросы