Каково использование лучшей практики SQL Server обработка ошибок T-SQL? [закрытый]

Это правда. В руководящих принципах взаимодействия с человеком говорится, что для нижней панели должно быть от 3 до 5 элементов.

35
задан SteveC 5 September 2013 в 08:33
поделиться

4 ответа

Необходимо считать это:

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

Я не могу рекомендовать ту ссылку достаточно высоко. Это немного длинно, но хорошим способом.

Существует правовая оговорка в передней стороне, что она была первоначально записана для SQL Server 2000, но она покрывает новые способности к обработке ошибок попытки/выгоды в SQL Server 2005 + также.

31
ответ дан 27 November 2019 в 07:04
поделиться

Мы в настоящее время используем этот шаблон для любых запросов, которые мы выполняем (Вы могли не учесть материал Транзакции, если Вам не нужен он в, например, оператор DDL):

BEGIN TRANSACTION
BEGIN TRY
    // do your SQL statements here

    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage

    ROLLBACK TRANSACTION
END CATCH

Конечно, Вы могли легко вставить перехваченную исключительную ситуацию в свою таблицу ошибок.

Это работает действительно хорошо на нас. Вы могли, вероятно, даже автоматизировать часть преобразования от Вашего старого сохраненного procs до нового формата с помощью Генерации кода (например, CodeSmith) или некоторый пользовательский код C#.

24
ответ дан 27 November 2019 в 07:04
поделиться

Нет набора в каменных лучших практиках для Обработки ошибок. Все это сводится к тому, что Ваши потребности и быть последовательным.

Вот образец таблицы и хранимой процедуры, которая хранит номера телефона.

 SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Phone](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Phone_Type_ID] [int] NOT NULL,
        [Area_Code] [char](3) NOT NULL,
        [Exchange] [char](3) NOT NULL,
        [Number] [char](4) NOT NULL,
        [Extension] [varchar](6) NULL,
     CONSTRAINT [PK_Phone] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
    SET ANSI_PADDING OFF
    GO
    /**/

    CREATE PROCEDURE [dbo].[usp_Phone_INS]
         @Customer_ID INT
        ,@Phone_Type_ID INT
        ,@Area_Code CHAR(3)
        ,@Exchange CHAR(3)
        ,@Number CHAR(4)
        ,@Extension VARCHAR(6)
    AS
    BEGIN
        SET NOCOUNT ON;

        DECLARE @Err INT, @Phone_ID INT

        BEGIN TRY
            INSERT INTO Phone
                (Phone_Type_ID, Area_Code, Exchange, Number, Extension)
            VALUES
                (@Phone_Type_ID, @Area_Code, @Exchange, @Number, @Extension)
            SET @Err = @@ERROR
            SET @Phone_ID = SCOPE_IDENTITY()
            /* 
                Custom error handling expected by the application.
                If Err = 0 then its good or no error, if its -1 or something else then something bad happened.
            */
            SELECT ISNULL(@Err,-1) AS Err, @Phone_ID
        END TRY
        BEGIN CATCH
            IF (XACT_STATE() <> 0)
                BEGIN
                    ROLLBACK TRANSACTION
                END

            /* 
                Add your own custom error handling here to return the passed in paramters. 
                I have removed my custom error halding code that deals with returning the passed in parameter values.
            */

            SELECT ERROR_NUMBER() AS Err, ISNULL(@Phone_ID,-1) AS ID
        END CATCH
    END
6
ответ дан 27 November 2019 в 07:04
поделиться

Похоже, что у Вас уже есть очень хороший дескриптор на этом. Я подозреваю, что Вы делаете больше чем 95% SQL-программистов там.

Необходимо найти некоторую интересную информацию здесь:

Одно [несвязанное] предложение: начните использовать' <>' вместо'! = '.

[* Наркоманы SQL ушли, таким образом, вторая статья не доступна. Я попытаюсь переиздать его где-нибудь и обновить ссылку.]

3
ответ дан 27 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: