ข้อผิดพลาด 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
ไม่รู้จะเล่ายังไงดี 555 อย่างที่ฉันพูดในความคิดเห็นอื่น ฉันยังใหม่อย่างยิ่งกับสิ่งที่เกี่ยวข้องกับ SSIS จากระยะไกล ฉันมาจากพื้นหลัง SQL ที่เบามาก ฉันจะแสดงให้คุณเห็นว่ามันเป็นอย่างไร?   -  person Samsonite    schedule 19.06.2014
comment
สร้างการควบคุมและกระแสข้อมูลที่แสดงงานขั้นต่ำที่จำเป็นในการแสดงปัญหา จับภาพหน้าจอและรวมไว้ในโพสต์ของคุณ เนื่องจากคุณโพสต์ข้อผิดพลาดที่เกี่ยวข้องกับงานที่เรียกว่า Sources-ItemData(1) ฉันคาดว่าจะเห็นงานนั้นอย่างน้อยในภาพหน้าจอของคุณ   -  person JodyT    schedule 20.06.2014


คำตอบ (4)


ตรวจสอบการกำหนดคอลัมน์อีกครั้งระหว่างต้นทางและปลายทางและส่วนประกอบที่อยู่ระหว่างนั้นด้วย

ทดลองใช้โดยการตั้งค่าคุณสมบัติของส่วนประกอบกระแสข้อมูล ValidateExternalMetadata เป็นเท็จ

โปรดดู นี่เช่นกัน

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 Source และสร้างใหม่อีกครั้ง จากนั้นลบการแมปของฟิลด์ใดฟิลด์หนึ่ง บันทึก กลับไปที่การแมปอีกครั้งและแมปกลับ กว่าที่มันควรจะทำงานได้ดี

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. วางกลับเข้าไปในงาน Data Flow แหล่งข้อมูลที่วางมีสคีมารีเฟรช คุณได้เก็บการแมปดาวน์สตรีมใด ๆ ที่สามารถเก็บไว้ได้ ตอนนี้คุณต้องเผชิญกับการบำรุงรักษาน้อยที่สุด
  3. ลบตัวเชื่อมต่อออกจากแหล่งข้อมูลเก่า
  4. แทนที่ตัวเชื่อมต่อจากแหล่งข้อมูลใหม่
  5. รักษาการแมป หากจำเป็น ในปลายทางข้อมูล
person Jai Jeffryes    schedule 04.01.2021