2009-09-20 1 views
2

У меня есть несколько хранимых процедур, в которых используется инструкция TRY/CATCH, поэтому я запускаю основную программу и, если она генерирует любые ошибки, я их улавливаю. Теперь моя проблема заключается в утверждении улова, у меня есть этот кусок кода:MS SQL 2008 cast null to string

  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 

Это прекрасно работает, пока ContentName не NULL, то он выходит из строя, я забыл, что вам нужно, чтобы бросить значения в строку, прежде чем вы можете добавить их к столбцу nvarchar. Итак, как мне преобразовать @ContentName, прежде чем вставлять его в таблицу Errors?

ответ

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 сервер предлагает 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 будет пустым. Ошибки возникают довольно часто с этими тремя значениями.