การแปลงสตริงที่ไม่ใช่ Unicode เป็น Unicode สตริง SSIS


9

ฉันกำลังสร้างแพ็คเกจที่ฉันจะส่งออกข้อมูลจากฐานข้อมูลไปยังไฟล์ excel ที่ว่างเปล่า เมื่อฉันเพิ่มเฉพาะส่วนประกอบต้นทางและปลายทางและฉันเรียกใช้แพคเกจฉันได้รับข้อผิดพลาดในการแปลงที่ระบุคอลัมน์เอาท์พุทและคอลัมน์ "A" ไม่สามารถแปลงระหว่างชนิดข้อมูลสตริงของ unicode และ non-unicode

ในการแก้ไขปัญหานี้ฉันได้เพิ่มส่วนประกอบการแปลงข้อมูลและแปลงคอลัมน์ทั้งหมดเป็น

"Unicode String [DT_WSTR]"

และฉันไม่ได้รับข้อผิดพลาดอีกต่อไป ปัญหาเดียวคือฉันมีประมาณ 50 คอลัมน์ที่ฉันต้องไป 1 ต่อ 1 และเลือก "Unicode String [DT_WSTR]" จากรายการแบบหล่นลง จากนั้นฉันต้องเข้าไปในองค์ประกอบปลายทางและแมปคอลัมน์ที่เพิ่งแปลงใหม่ไปยังไฟล์ excel ของฉัน

คำถามของฉันคือถ้ามีคนเจอปัญหานี้จะมีวิธีที่มีประสิทธิภาพมากขึ้นในการหลีกเลี่ยงการแปลงประเภทข้อมูลด้วยตนเองทั้งหมดหรือไม่? ต้องแปลงและแมปคอลัมน์ทั้งหมดทีละรายการดูเหมือนจะไม่เป็นประโยชน์โดยเฉพาะถ้าคุณมีจำนวนแถวมาก

ฉันเข้าใจว่าไฟล์ excel ไม่ใช่วิธีที่ดีที่สุดในการนำเข้าและส่งออกข้อมูล แต่เป็นสิ่งที่จำเป็นในกรณีนี้โดยเฉพาะ

ฉันอาจมองหาวิธีที่จะส่งออกไปยังไฟล์ข้อความแบบแฟลตและลองแปลงเป็น excel เป็นขั้นตอนสุดท้ายในแพ็คเกจ ฉันกำลังกระโดดนี้จะไม่เรียกข้อผิดพลาดการแปลง unicode / nonunicode เดียวกัน


วิธี carpal อุโมงค์ของคุณเป็นอย่างไรหลังจากนั้น :-)
Patrick Honorez

ตรวจสอบให้แน่ใจว่าตารางที่คุณย้ายข้อมูลไปใช้โดยใช้ชนิดข้อมูล Unicode (เช่น: nvarchar (50) แทน varchar (50))
MacGyver

คำตอบ:


15

เป็นทางเลือกแทน RDC ฉันจะข้ามการแปลงชนิดข้อมูลใน SSIS และแปลงเป็น nvarchar อย่างชัดเจนในแหล่งข้อมูลของฉัน

การใช้

ในคิวรีต้นทางของคุณ (และคุณกำลังใช้คิวรีต้นทางและไม่ใช่เพียงแค่เลือกตารางในดรอปดาวน์) ให้แปลงสิ่งต่างๆให้มีความยาวถ่านที่เหมาะสม n (var)

แทน

SELECT
    E.BusinessEntityID
,   E.NationalIDNumber
,   E.LoginID
,   E.JobTitle
,   E.BirthDate
,   E.MaritalStatus
,   E.Gender
FROM
    HumanResources.Employee AS E

ใช้แบบสอบถามเช่น

SELECT
    CAST(E.BusinessEntityID AS nvarchar(10)) AS BusinessEntityID
,   CAST(E.NationalIDNumber AS nvarchar(15)) AS NationalIDNumber
,   CAST(E.LoginID AS nvarchar(256)) AS LoginID
,   CAST(E.JobTitle AS nvarchar(50)) AS JobTitle
,   CAST(E.BirthDate AS nvarchar(10)) AS BirthDate
,   CAST(E.MaritalStatus AS nchar(1)) AS MaritalStatus
,   CAST(E.Gender AS nchar(1)) AS Gender
FROM
    HumanResources.Employee AS E

นักเรียนที่ชาญฉลาดของ AdventureWorks จะรับรู้ว่าข้อมูลนั้นเป็นn(var)charประเภทอยู่แล้วแต่นี่เป็นเพียงการแสดงให้เห็นถึงแนวคิด

ประโยชน์ที่ได้รับ

  • หน่วยความจำน้อยใช้ ขณะนี้คุณจะจัดสรรและจัดเก็บข้อมูล "เดียวกัน" สองชุดโดยใช้Data Conversion Componentใน SSIS
  • ไม่มีRSI ไม่จำเป็นต้องคลิก N ครั้งและระบุข้อมูลทั้งหมดนั้นในเครื่องมือแก้ไขเล็ก ๆ น้อย ๆ ที่พวกเขามีให้ ฉันจะใช้แบบสอบถามกับ dmv / information_schema เพื่อทำการส่งออกตาราง "Excel ready" เพิ่มเติมโดยอัตโนมัติ
  • ไม่มีการติดตั้งองค์ประกอบที่กำหนดเอง ฉันทำงานที่สถานที่ซึ่งการติดตั้งโอเพนซอร์สนั้นเป็น verboten นอกจากนี้ยังมีค่าใช้จ่ายในการบำรุงรักษารอการติดตั้งแอปของบุคคลที่สามเนื่องจากตอนนี้ "ทุกคน" จำเป็นต้องติดตั้งแอพเดียวกันเพื่อรักษารหัสของคุณและจะต้องได้รับการติดตั้งบนเซิร์ฟเวอร์และอินโฟเซคและเราต้องการการลงทะเบียนจากผู้คนที่มีค่ามากกว่าพันล้านคนที่อยู่เหนือคุณ ...

1
"เป็นทางเลือกแทน RDC" - RDC คืออะไร เมื่อฉันอ่านคำตอบต่อไปฉันคิดว่าคุณอาจหมายถึงการแทนที่ส่วนประกอบข้อมูล แต่เนื่องจากผู้เขียนโพสต์ต้นฉบับไม่ได้กล่าวถึงส่วนประกอบนั้นอาจเร็วเกินไปสำหรับตัวย่อ :-)
Thronk

พูดเกี่ยวกับ RSI CONVERTควรวางได้ง่ายกว่า 50 เท่าCASTเนื่องจากข้อโต้แย้งอยู่ข้างหน้า
Patrick Honorez


2

หากคุณต้องเปลี่ยนจาก "Unicode string (DT_WSTR)" เป็น "string (DT_STR)" หรือในทางกลับกันคุณอาจทำสิ่งนี้:

  1. บันทึกสำเนาของไฟล์ package.dtsx- ของคุณ (ในกรณีที่คุณต้องกู้คืน)
  2. เปิด package.dtsx ในโปรแกรมแก้ไขหรือใน MS Visual Studio คลิกขวาที่แพ็คเกจและเลือก "ดูรหัส" คุณจะเห็นไฟล์ XML

ค้นหาสตริงDTS:DataTypeหากตามด้วย = "130" ดังนั้นคอลัมน์จะถูกกำหนดเป็น DT_WSTR (unicode)

หากตามด้วย = "129" แสดงว่าคอลัมน์นั้นถูกกำหนดเป็น DT_STR (ไม่ใช่ยูนิโค้ด) ให้ใช้การค้นหาและแทนที่ด้วยความระมัดระวัง (คุณเคยทำสำเนามาก่อนใช่ไหม?)

บันทึกไฟล์และอาจเป็นได้


1
ยินดีต้อนรับสู่ DBA SE! เคล็ดลับสำหรับมืออาชีพ: ไซต์มีคุณสมบัติการจัดรูปแบบข้อความต่าง ๆ เพื่อให้ข้อความของคุณดูดีขึ้น ใช้ไอคอนที่ด้านบนของกล่องข้อความตัวแก้ไข
peterh - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.