Kesalahan SSIS: Kolom Eksternal untuk Sumber tidak sinkron dengan kolom Sumber Data; Bagaimana cara menghapus Kolom Eksternal?

Kueri harus menampilkan daftar Item tertentu, bersama dengan info seperti informasi toko dan info manajer. Menggunakan Kursor untuk menelusuri daftar berbagai tingkat manajemen, memilih informasi yang relevan, lalu mengirimkan email kepada orang tersebut mengenai kueri yang dikembalikan untuk distrik/wilayah/toko mereka.

Masalah saya ada pada bagian perjalanan SSIS. Meskipun kodenya berfungsi seperti dijalankan, jika saya menjalankan Itemdata.dtsx secara terpisah (untuk melihat kesalahan), saya mendapat kesalahan:

"Peringatan: Kolom eksternal untuk komponen "Sources-ItemData"(1) tidak sinkron dengan kolom sumber data. Kolom eksternal "RM_Email"(49) perlu dihapus dari kolom eksternal. Kolom eksternal "SM_Email" (46) perlu dihapus dari kolom eksternal. Kolom eksternal "DM_Email"(43) perlu dihapus dari kolom eksternal."

Hal ini menyebabkan SQL Server Mngt Studio mengatakan itu berjalan, tetapi isi email tidak lain hanyalah header tabel; tidak ada data, dan header tabel tidak berubah apa pun yang saya lakukan.

Saya telah menghilangkan kolom-kolom ini dari penyebutan apa pun di kode sumber saya (diposting di bawah) dan di Tabel yang digunakannya. Apa yang saya lewatkan?

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 sumber
comment
Seperti apa paket SSIS Anda?   -  person JodyT    schedule 19.06.2014
comment
Aku bingung bagaimana cara memberitahumu, haha. Seperti yang saya katakan di komentar lain, sayangnya saya baru mengenal segala hal yang berhubungan dengan SSIS. Saya berasal dari latar belakang SQL yang sangat ringan. Bagaimana cara saya menunjukkan kepada Anda seperti apa bentuknya?   -  person Samsonite    schedule 19.06.2014
comment
Buat kontrol dan aliran data yang menunjukkan tugas minimum yang diperlukan untuk mengilustrasikan masalah. Buat tangkapan layarnya dan sertakan dalam postingan Anda. Karena Anda memposting kesalahan terkait tugas yang disebut Sources-ItemData(1), saya berharap melihat setidaknya tugas itu di tangkapan layar Anda.   -  person JodyT    schedule 20.06.2014


Jawaban (4)


Periksa kembali penetapan kolom antara sumber dan tujuan dan juga komponen di antara.

Cobalah dengan menyetel Properti komponen aliran data, ValidateExternalMetadata ke False.

Silakan lihat ini juga.

person Vikramsinh Shinde    schedule 19.06.2014
comment
Saya rasa saya mungkin perlu pelatihan ulang tentang proses ini; ini pertama kalinya saya menggunakan SSIS dan beberapa kode dipinjam dari permintaan atasan sebelumnya. Saya membandingkan kolom kode saya dengan kolom di Tabel dan keduanya cocok. Saya tidak yakin apa yang harus dilihat selanjutnya. (Masih cukup baru di industri ini, maafkan ketidaktahuan saya). Dalam situasi ini, apa yang dimaksud dengan Sumber dan Tujuan? Apa yang dimaksud dengan komponen di antara? - person Samsonite; 19.06.2014
comment
ValidateExternalMetadata to False adalah jawabannya saat menggunakan OLE DB ke Oracle dan kesalahan ini terjadi. - person Andrew Grothe; 22.03.2018
comment
ValidateExternalMetadata = false berhasil untuk saya - person Adam; 13.07.2021

Sepertinya Anda baru saja mengubah Sumber OLEDB atau jenis sumber lainnya.

Oleh karena itu, Anda harus menghapus Sumber OLEDB dan membuat yang baru lagi. Kemudian hapus juga pemetaan bidang tertentu, simpan, kembali ke pemetaan lagi dan petakan kembali. Daripada itu seharusnya berfungsi dengan baik.

person Turpan    schedule 20.10.2016
comment
Menghapus dan membuat ulang selalu berhasil, tetapi apakah ada cara untuk melakukannya tanpa membuat ulang? Saya tidak melakukannya sekali pun tetapi tidak tahu apa yang saya klik. - person RaRdEvA; 24.09.2019

Saya juga mengalami masalah yang sama ketika semua nama kolom saya sama tetapi masih mendapatkan kolom eksternal untuk 'nama excel' tidak sinkron dengan kolom sumber data. Kolom namasaya perlu ditambahkan ke kolom eksternal. Kolom F62 perlu ditambahkan ke kolom eksternal. Saya telah memvalidasi berkali-kali juga tetapi tidak berhasil, bahkan saya mencocokkan header kolom saya dengan tabel tujuan juga dalam rumus excel dan semuanya tampak benar. Jadi secara manual satu per satu kolom saya periksa dan akhirnya menemukan bahwa file yang saya gunakan untuk file saya connection awalnya memiliki huruf pertama dengan huruf kapital Mycolname , sedangkan file yang saya gunakan (saya biasa menimpa file sumber) saya hanya menempelkan data dari beberapa file lain karena header saya diubah. Saya mengubah header lagi file input saya dan berhasil.

Catatan : Hati-hati saat menggunakan SSIS...sangat berbahaya.

person sanjeeb    schedule 07.08.2020

Daripada menghapus dan membuat ulang:

  1. Salin Sumber Data yang ada.
  2. Tempelkan kembali ke Tugas Aliran Data. Sumber Data yang ditempel memiliki skema yang diperbarui. Anda telah menyimpan semua pemetaan hilir yang mungkin dipertahankan. Anda sekarang menghadapi pemeliharaan sesedikit mungkin.
  3. Hapus konektor dari Sumber Data lama.
  4. Gantikan konektor dari Sumber Data baru.
  5. Pertahankan pemetaan, jika perlu, di Tujuan Data.
person Jai Jeffryes    schedule 04.01.2021