Ошибка служб SSIS: внешний столбец для источника не синхронизирован со столбцами источника данных; Как удалить внешние столбцы?

Запрос должен выводить определенный список элементов вместе с информацией, такой как информация о магазине и информация о менеджере. Использует курсор для пролистывания списка различных уровней управления, выбирает соответствующую информацию, а затем отправляет этому человеку по электронной почте информацию о том, что запрос вернул для его района/региона/магазина.

Моя проблема связана с этапом пути SSIS. Хотя код работает так, как будто он работает, если я запускаю Itemdata.dtsx отдельно (чтобы увидеть ошибки), он выдает мне ошибку:

«Предупреждение: внешние столбцы для компонента «Sources-ItemData» (1) не синхронизированы со столбцами источника данных. Внешний столбец «RM_Email» (49) необходимо удалить из внешних столбцов. Внешний столбец «SM_Email» (46) необходимо удалить из внешних столбцов. Внешний столбец «DM_Email» (43) необходимо удалить из внешних столбцов».

Это приводит к тому, что SQL Server Mngt Studio сообщает, что он запущен, но содержимое электронных писем представляет собой не что иное, как заголовки таблиц; никаких данных, и заголовки таблиц не меняются независимо от того, что я делаю.

Я исключил эти столбцы из любого упоминания в моем исходном коде (опубликованном ниже) и в таблице, которую он использует. Что мне не хватает?

BEGIN

SET NOCOUNT ON;

DECLARE @ProcedureName     varchar(255)
DECLARE @ExportFolder      varchar(255)
DECLARE @TempFolder        varchar(255)
DECLARE @WarningLevel      varchar(255) = 'log'
DECLARE @MsgDescription    varchar(2000) = ''
DECLARE @RecordCount       int = 0  
DECLARE @ReportDate        date = getdate()
DECLARE @Begdate           date = convert(date,(dateadd(month,-1,getdate())))
DECLARE @Enddate           date = convert(date,(dateadd(day,-1,getdate())))
DECLARE @Siteid            int 
DECLARE @Subject           varchar(75) = ''
DECLARE @Body              varchar(50) = ''
DECLARE @RMLastName        varchar(25)
DECLARE @RMFirstName           varchar(25)
DECLARE @RegionKey         int
DECLARE @DistrictKey       int
DECLARE @Email             varchar(50)

BEGIN TRY 
            --Table used as data source for each pass
            Truncate Table Example.dbo.itemdata


--Send reports to Regional Managers by building Cursor RMListCursor, 
--then running SELECT statement against each name (using @RMLastName and @RMFirstName to discern), 
--then emails results of SELECT statement to that Regional Manager. 
--Goes through CursorList, then ends. 
BEGIN
    --Set cursor for RM Email; returns all regional managers. 
DECLARE RMListCursor CURSOR FOR 
SELECT distinct t.lastname, t.firstname, t.Email
FROM Example.[dbo].[tblUser] t
JOIN example.dbo.vStoreDistrictRegionActive vs
    ON t.LastName = vs.RMLastName and t.FirstName = vs.RMFirstName 
ORDER BY LastName

OPEN RMListCursor

FETCH NEXT FROM RMListCursor
INTO @RMLastName
    , @RMFirstName
    , @Email

WHILE @@FETCH_STATUS = 0--(@SetInt < 6)

    BEGIN

    Truncate table Example.dbo.itemdata
    --Builds data, then inserts into Table built for this query. Note that there is no mention of DM_EMAIL, RM_EMAIL, or SM_EMail anywhere. 
    INSERT INTO Example.dbo.itemdata
        SELECT InvoiceNumber,
        shipFROMid,
        ad.SiteId,
        MfrCode,
        PartCode,
        UnitNetCore,
        ad.QuantityShipped,
        ShipDate,
        --First/Last Name of this item's store's District Manager. 
        rtrim(substring((SELECT ISNULL(DMfirstName,'') FROM example.dbo.vSiteRegionDistrictActiveV2 dm WHERE ad.siteid = dm.SiteNumber),1,30)) + ' ' +
            substring((SELECT ISNULL(DMLastName,'')  FROM example.dbo.vSiteRegionDistrictActiveV2 dm WHERE ad.siteid = dm.SiteNumber),1,30) DM
            --This is where DM_EMAIL, RM_EMAIL, and SM_EMail originally were before they were removed from both here and .ItemData.
        FROM example.dbo.vInvoiceHeaderDetail_Adis ad
            join example.dbo.Site ss on ad.SiteId=ss.siteid
            join example.dbo.vStoreDistrictRegionActive vs on ad.SiteId = vs.SiteId
        WHERE ad.siteid is not null and UnitNetCore>=250 and SUBSTRING(InvoiceNumber,2,1)='D' and QuantityShipped>0
            and isactive=1 and isowned=1 
            and ShipDate between @Begdate and @Enddate
            and vs.RMFirstName = @RMFirstName
            and vs.RMLastname = @RMLastName

            ORDER BY ad.SiteId,ShipFROMID,shipdate



    -- Execute SSIS package which downloads table to d: for email.  

            set @RecordCount=@@ROWCOUNT

            --Quick check so that if the results were blank, don't bother sending a blank email. 
            IF @RecordCount<>0
                BEGIN

                    set @Subject = 'Cores billed from PWI >= $250 ' + cast(CONVERT(date,GETDATE()) as varchar(12))
                    set @Body    = 'Run date/time- ' + cast(GETDATE() as CHAR(20))

                    EXEC  xp_cmdshell 'd:\"Program Files (x86)"\"Microsoft SQL Server"\100\DTS\Binn\DTexec.exe  /f "D:\etl\bulk\ssis\Misc\ItemInfo.dtsx"'

                    EXEC msdb.dbo.sp_send_dbmail 
                        @profile_name   ='SQL Mail',
                        @recipients     ='test', --@email
                        @subject        = @Subject,
                        @body           = @Body,
                        @body_format    = 'HTML',
                        @File_attachments = 'D:\export\temp\ItemInfo.xls',                
                        @attach_query_result_as_file =0,
                        @query_attachment_filename='\ItemInfo.xls',
                        @query_result_width = 500

                END
        --Brings CURSOR back up to next name on List, repeats process. 
        FETCH NEXT FROM RMListCursor
            INTO @RMLastName
                , @RMFirstName
                , @Email
    END
END

CLOSE RMListCursor
DEALLOCATE RMListCursor

END TRY

BEGIN CATCH

    SET @WarningLevel = 'error'
    SET @MsgDescription = 'SQL Err= [' + CAST(ERROR_MESSAGE() as varchar(200)) + ' (' + CAST(ERROR_LINE() as varchar) + ')]' 
    EXEC example.dbo.spAddSysMessage  'Store Aging', @WarningLevel , @ProcedureName , '',  'EOM Store Aging Report', @RecordCount 

END CATCH


 END

person Samsonite    schedule 19.06.2014    source источник
comment
Как выглядит ваш пакет SSIS?   -  person JodyT    schedule 19.06.2014
comment
Я не знаю, как тебе сказать, ха-ха. Как я уже сказал в другом комментарии, я ужасно новичок во всем, что отдаленно связано с SSIS. У меня очень легкий опыт работы с SQL. Как я могу показать вам, как это выглядит?   -  person Samsonite    schedule 19.06.2014
comment
Создайте элемент управления и поток данных, который показывает минимальные задачи, необходимые для иллюстрации проблемы. Сделайте скриншот и вставьте его в свой пост. Поскольку вы публикуете сообщение об ошибке, связанное с задачей под названием Sources-ItemData(1), я ожидаю увидеть по крайней мере эту задачу на вашем снимке экрана.   -  person JodyT    schedule 20.06.2014


Ответы (4)


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

Попробуйте, установив свойства компонента потока данных, ValidateExternalMetadata в значение False.

Пожалуйста, посмотрите это тоже.

person Vikramsinh Shinde    schedule 19.06.2014
comment
Я думаю, что мне может понадобиться повторное обучение этому процессу; я впервые использую SSIS, и часть кода заимствована из предыдущего запроса начальника. Я сравнил столбцы своего кода со столбцами в таблице, и они совпадают. Я не уверен, что смотреть дальше. (Все еще довольно новичок в отрасли, простите мое невежество). Что в этой ситуации является Источником и Назначением? Что такое промежуточный компонент? - person Samsonite; 19.06.2014
comment
ValidateExternalMetadata to False — это ответ при использовании OLE DB для Oracle, и возникает эта ошибка. - person Andrew Grothe; 22.03.2018
comment
ValidateExternalMetadata = false у меня сработало - person Adam; 13.07.2021

Похоже, вы недавно меняли источник OLEDB или другой тип источника.

Таким образом, вы должны удалить источник OLEDB и снова создать новый. Затем также удалите сопоставление определенного поля, сохраните, снова вернитесь к сопоставлению и сопоставьте его обратно. Чем это должно работать нормально.

person Turpan    schedule 20.10.2016
comment
Удаление и повторное создание всегда работает, но есть ли способ сделать это без повторного создания? Я не один раз, но не знаю, что я нажал. - person RaRdEvA; 24.09.2019

У меня также была такая же проблема, когда все имена моих столбцов были одинаковыми, но по-прежнему получались внешние столбцы для «excelName» не синхронизированы со столбцами источника данных. Столбец mycolname необходимо добавить к внешним столбцам. Столбец F62 необходимо добавить к внешним столбцам. Я также проверял много раз, но не повезло, даже я сопоставил заголовок столбца с таблицей назначения в формуле excel, и все, кажется, правильно. Поэтому вручную один за другим я проверял столбец и, наконец, обнаружил, что файл, который я использовал для своего соединение изначально имело первую букву заглавной Mycolname , где в качестве файла, который я использовал (я использовал для перезаписи исходного файла), я просто вставил данные из какого-то другого файла, из-за которого мой заголовок был изменен. Я снова изменил заголовок моего входного файла, и это сработало.

Примечание. Будьте осторожны при использовании служб SSIS... это очень опасно.

person sanjeeb    schedule 07.08.2020

Вместо удаления и повторного создания:

  1. Скопируйте существующий источник данных.
  2. Вставьте его обратно в задачу потока данных. Вставленный источник данных имеет обновленную схему. Вы сохранили все нисходящие сопоставления, которые можно сохранить. Теперь вам предстоит минимально возможное техническое обслуживание.
  3. Удалите соединитель из старого источника данных.
  4. Замените соединитель из нового источника данных.
  5. Поддерживайте сопоставления, если это необходимо, в назначении данных.
person Jai Jeffryes    schedule 04.01.2021