MS SQL 2008 приведение ноль к строке - PullRequest
2 голосов
/ 20 сентября 2009

Я получил несколько хранимых процедур, которые используют оператор TRY / CATCH, поэтому я выполняю основную программу и, если она генерирует какие-либо ошибки, я их отлавливаю. Теперь моя проблема в выражении catch, у меня есть этот кусок кода:

            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, прежде чем я вставлю его в таблицу ошибок?

Ответы [ 2 ]

6 голосов
/ 20 сентября 2009

Вам не нужно разыгрывать - используйте функцию 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 и convert методы , которые можно использовать для преобразования данных из одного типа в другой. Вам здесь это не нужно, но это полезно знать.

0 голосов
/ 21 сентября 2009

в качестве дополнительной точки к @ ответу Эндрю Хэра , я бы отформатировал ваши строки немного по-другому:

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

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

...