SQL错误处理

SQL错误处理,sql,sql-server,Sql,Sql Server,您能告诉我是否值得将错误处理放入此存储过程中吗 -- ********************************************** -- Delete and create a new 'Truncate' function... -- ********************************************** IF EXISTS(SELECT name FROM sysobjects WHERE name =

您能告诉我是否值得将错误处理放入此存储过程中吗

-- **********************************************
-- 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

非常感谢,

首先,它是一个函数,而不是一个存储过程

但是错误处理总是很好的-但是SQL函数可能不是放置它的最佳位置

考虑到此函数在已知模式和已知数据格式varchar上工作,并且具有已知SQL函数len、substring。。。你应该能够对这个单元进行测试,并考虑它可能会对函数本身造成的任何错误。


这让我倾向于回答“不,不要在这里处理错误”。

在您的t-SQL编码中实现自定义错误处理在我看来是一个很好的做法,如果不是必要的话

如果您希望开发的存储过程/函数是应用程序中间层的一部分,那么我建议您实现自己的自定义错误处理

我的意思是,您应该提出特定于应用程序进程生成的环境的错误,并将这些错误记录在相应数据库中的通用错误日志表中

SQL Server联机丛书中提供了一个示例,说明如何执行此操作并将其合并到典型的try-catch块中

特别是标题为“AdventureWorks数据库中的错误处理解决方案”的部分


如果你问一个具体的技术问题,你会有更好的机会得到答案。这不是一个“为我做我的工作”的网站。@AdamRalph:他是在问你是否愿意做这件事,而不是他除了问你是否认为他应该或不应该在函数中放置错误处理之外,没有要求你做任何事。