2009-09-20 44 views
2

我有一个使用try/catch语句的几个存储过程,所以我执行主程序,如果它产生的任何错误我抓住他们。现在我的问题是在catch语句,我有这段代码:MS SQL 2008年投空字符串

  BEGIN TRY 
     INSERT INTO ContentTypes (ContentName, ContentPath) VALUES (@ContentName, @ContentPath) 

     SET @QResult = 0 
    END TRY 
    BEGIN CATCH   

     SET @QResult = 1 
     INSERT INTO Errors (ErrorNumber, ErrorLine, ErrorProcedure, ErrorSeverity, ErrorState, ErrorParameters) 
     VALUES (ERROR_NUMBER(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_SEVERITY(), ERROR_STATE(), 'ContentName:' + @ContentName + ',ContentPath:' + @ContentPath) 
     RETURN 
    END CATCH 

这完美的作品,直到内容名是NULL,那么它崩溃了,我忘了你需要的值转换为字符串,然后才能将它们添加到一个nvarchar列。那么在我将它插入错误表之前,我怎么转换 @ContentName?

回答

6

你不需要投 - 使用coalesce功能:

返回其参数中第一个非空表达式。

你会使用这样的:

insert into Errors (ErrorNumber, ErrorLine, 
    ErrorProcedure, ErrorSeverity, ErrorState, ErrorParameters) 
values (ERROR_NUMBER(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_SEVERITY(), 
    ERROR_STATE(), 'ContentName:' 
    + coalesce(@ContentName, '') 
    + ',ContentPath:' + coalesce(@ContentPath, '')) 

作为一个侧面说明,SQL Server提供了cast and convert methods,您可以使用将数据从一种类型转换为另一种。这里你不需要它,但很高兴知道。

0

作为一个额外的点@Andrew Hare's answer,我会格式化字符串有点不同:

insert into Errors (ErrorNumber, ErrorLine, 
    ErrorProcedure, ErrorSeverity, ErrorState, ErrorParameters) 
values (ERROR_NUMBER(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_SEVERITY(), 
    ERROR_STATE() 
    ,'ContentName:' + coalesce('"'[email protected]+'"', 'null') 
    + ',ContentPath:' + coalesce('"'[email protected]+'"', 'null') 

做这种方式,你可以告诉我们,如果变量是空字符串或为空。变量将具有双引号之间的值,因此“”是空字符串,并且“”是单个空格,并且null将为空。这三个值经常会出现虫虫。