Обработка ошибок SQL - PullRequest
2 голосов
/ 19 июня 2009

Можете ли вы сказать, стоит ли обрабатывать ошибки в этой хранимой процедуре?

-- **********************************************
-- Delete and create a new 'Truncate' function...
-- **********************************************

IF EXISTS(SELECT name 
          FROM   sysobjects 
          WHERE  name = 'truncate_description' AND 
                 type = 'FN')
  DROP FUNCTION truncate_description
GO

CREATE FUNCTION truncate_description(@description varchar(1000), @numchars int=500) RETURNS varchar(500)
BEGIN
  DECLARE @newDescription varchar(500);
  DECLARE @truncMessage varchar(33);
  SET @truncMessage = '..Click on title to read article.';

  IF (len(@description) >= @numchars)
    IF (substring(@description, @numchars, 1) = '.')
      SET @newDescription = @description;
    ELSE
    BEGIN
      SET @newDescription = substring(@description, 1, @numchars - len(@truncMessage));
      IF (charindex('.', @newDescription) > 0)
      BEGIN
        WHILE (substring(@newDescription, len(@newDescription), 1) <> '.')
        BEGIN
          SET @newDescription = substring(@newDescription, 1, len(@newDescription) - 1);
        END
      END
      SET @newDescription = @newDescription + @truncMessage;
    END
  ELSE
    SET @newDescription = @description;

  RETURN @newDescription;
END
GO


-- *********************************************
-- Delete and create a new 'Truncate' trigger...
-- *********************************************

IF EXISTS(SELECT name 
          FROM   sysobjects 
          WHERE  name = 'tr_tblProfile_truncateDescription' AND 
                 type = 'TR') 
  DROP TRIGGER tr_tblProfile_truncateDescription;
GO

CREATE TRIGGER tr_tblProfile_truncateDescription ON tbl_profile
AFTER INSERT, UPDATE AS
BEGIN
  UPDATE tbl_profile 
  SET description = dbo.truncate_description(i.description, 500)
  FROM tbl_profile p INNER JOIN inserted i on p.id=i.id
END
GO


-- ******************************************
-- Run the trigger on all existing records...
-- ******************************************

UPDATE tbl_Profile
SET description = description
GO

Большое спасибо,

Ответы [ 2 ]

3 голосов
/ 19 июня 2009

Прежде всего - это функция, а не хранимая процедура.

Но обработка ошибок всегда хороша - однако, функция SQL, вероятно, не лучшее место для ее размещения.

Учитывая, что эта функция работает с известной схемой и известным форматом данных (varchar) с известными функциями SQL (len, substring) ... вы должны быть в состоянии выполнить модульное тестирование и считать любые ошибки, которые она может выдать, внешними по отношению к сама функция.

Это заставляет меня склоняться к ответу «нет, не обрабатывайте ошибки здесь».

1 голос
/ 19 июня 2009

Реализация пользовательской обработки ошибок в вашей кодировке T-SQL, на мой взгляд, хорошая, но не существенная практика.

Если хранимая процедура / функция, которую вы хотите разработать, является частью среднего уровня приложений, то я бы порекомендовал вам реализовать собственную обработку ошибок.

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

Пример того, как сделать это и включить его в типичный блок try catch, можно найти в электронной документации по SQL Server.

В частности, раздел под названием: Решение для обработки ошибок в базе данных Adventure Works

http://msdn.microsoft.com/en-us/library/ms179296(SQL.90).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...