SSIS (SQL Server 2005) не перехватывает исключение SQL - PullRequest
0 голосов
/ 31 июля 2009

Я запускаю «Выполнить задачу SQL» в службах SSIS Он запускает хранимую процедуру, которая делает некоторую проверку В хранимой процедуре у меня есть команда RAISERROR, когда что-то идет не так. Однако, когда я проверяю это, эта задача не может быть прервана. Я гуглил по этому поводу и нашел много ссылок, но ни одно решение не работает для меня. Я обновил свой SQL Server 2005 до пакета обновления 3, но это не имеет никакого значения. Одна ссылка предлагает добавить операторы PRINT, когда выдается исключение. Это не работает. Так как мне это исправить? Код в хранимой процедуре:

ALTER PROCEDURE [dbo].[usp_VAL_Journey] 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @Month AS INT
                    , @Year AS INT
    SELECT TOP 1 @Year = DATEPART(YEAR, Date), @Month = DATEPART(MONTH, Date)
            FROM dbo.JourneyLandingTable

    SELECT TOP 1 *
            FROM dbo.JourneyMasterTable
            WHERE DATEPART(YEAR, Date) = @Year 
            AND DATEPART(MONTH, Date) = @Month
    IF @@ROWCOUNT > 0
    BEGIN
            RAISERROR('JourneyMasterTable already contains data for this month.', 16, 1)
            RETURN
    END

    SELECT DATEPART(YEAR, Date) AS year1, DATEPART(MONTH, Date) AS month1
    FROM dbo.JourneyLandingTable
    GROUP BY DATEPART(YEAR, Date), DATEPART(MONTH, Date)

    IF @@ROWCOUNT > 1
    BEGIN
            RAISERROR('JourneyLandingTable contains data for more than 1 month.', 16, 1)
    END
END

Ответы [ 2 ]

0 голосов
/ 01 августа 2009

вы можете попытаться вернуть какое-то значение "RETURN n"

ALTER PROCEDURE [dbo].[usp_VAL_Journey] 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @Month AS INT
                    , @Year AS INT
    SELECT TOP 1 @Year = DATEPART(YEAR, Date), @Month = DATEPART(MONTH, Date)
            FROM dbo.JourneyLandingTable

    SELECT TOP 1 *
            FROM dbo.JourneyMasterTable
            WHERE DATEPART(YEAR, Date) = @Year 
            AND DATEPART(MONTH, Date) = @Month
    IF @@ROWCOUNT > 0
    BEGIN
            RAISERROR('JourneyMasterTable already contains data for this month.', 16, 1)
            RETURN 10 --<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    END

    SELECT DATEPART(YEAR, Date) AS year1, DATEPART(MONTH, Date) AS month1
    FROM dbo.JourneyLandingTable
    GROUP BY DATEPART(YEAR, Date), DATEPART(MONTH, Date)

    IF @@ROWCOUNT > 1
    BEGIN
            RAISERROR('JourneyLandingTable contains data for more than 1 month.', 16, 1)
            RETURN 20 --<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    END
END

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

0 голосов
/ 31 июля 2009

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

declare @errorString varchar(100)
IF @rc > 0
BEGIN
    set @errorString = 'Error(s) occured when trying to run sp_blahblah error count ' + cast(@rc as varchar(10))
    raiserror(@errorString , 16, 1)
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...