У меня есть хранимая процедура, которая выполняет простую транзакцию вставки с блоком try / catch.
Если транзакция успешна, OUTPUT
вернет вставленный идентификатор записи.Если произойдет ошибка, я хотел бы вернуть содержимое из блока try / catch.Мой текущий код будет возвращать пустое значение RecID
в случае возникновения ошибки.Вот мой пример кода:
CREATE PROCEDURE [dbo].[InsertRecord]
@Status BIT = NULL,
@Name VARCHAR(50) = NULL,
@Code CHAR(2) = NULL,
@ActionID UNIQUEIDENTIFIER = NULL
AS
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRY
BEGIN
INSERT INTO dbo.Dictionary(
Status,Name,Code,ActionDt,ActionID
)
OUTPUT INSERTED.RecID
VALUES(
@Status,@Name,@Code,CURRENT_TIMESTAMP,@ActionID
);
END
END TRY
BEGIN CATCH
SELECT
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage,
CURRENT_TIMESTAMP AS DateTime
END CATCH
Вот то, что код выше вернется, если я попытаюсь вставить запись, которая уже существует:
ErrorProcedure
InsertRecord
ErrorLine
16
ErrorNumber
2627
ErrorMessage
Violation of PRIMARY KEY constraint 'PK_Code'.
Cannot insert duplicate key in object 'dbo.Dictionary'.
The duplicate key value is (44).
DateTime
2018-08-23 10:46:02.920
Это то, что я ожидаю, и этопоказ в Management Studio 2008. Когда я вызываю эту процедуру с ColdFusion, я просто получаю RecID = ''
.Вот пример, как я вызываю эту процедуру:
<cftry>
<cfstoredproc procedure="InsertRecord" datasource="#dsn#">
<cfprocparam dbvarname="@Status" value="#trim(arguments.frm_status)#" cfsqltype="cf_sql_bit" />
<cfprocparam dbvarname="@Code" value="#trim(arguments.frm_code)#" cfsqltype="cf_sql_char" maxlength="2" null="#!len(trim(arguments.frm_code))#" />
<cfprocparam dbvarname="@Name" value="#trim(arguments.frm_name)#" cfsqltype="cf_sql_varchar" maxlength="50" null="#!len(trim(arguments.frm_name))#" />
<cfprocparam dbvarname="@ActionID" value="#trim(SESSION.UserID)#" cfsqltype="cf_sql_idstamp" maxlength="50" null="#!len(trim(SESSION.UserID))#" />
<cfprocresult name="Result"/>
</cfstoredproc>
<cfset local.fnResults = {status : "200", RecID : Result.RecID}>
<cfcatch type="any">
<cfset local.fnResults = {error:cfcatch,status : "400", class : "alert-danger", message : "Error! Please contact your administrator."}>
</cfcatch>
</cftry>
Есть ли способ вернуть ошибку из хранимой процедуры в ColdFusion после выполнения?