Перетворення рядка Non Unicode в рядок Unisode SSIS


9

Я створюю пакет, де я буду експортувати дані з бази даних у порожній файл Excel. Коли я додав лише вихідні та цільові компоненти та запустив пакет, я отримав помилку перетворення, вказуючи, що стовпець "Вихід" та стовпець "A" не можуть конвертувати між типами даних unicode та unicode string.

Щоб виправити це, я додав компонент перетворення даних і перетворив усі стовпці в

"Рядок Unicode [DT_WSTR]"

і я більше не отримував помилку. Єдина проблема полягає в тому, що в мене було близько 50 стовпців, куди мені довелося перейти 1 на 1 і вибрати зі спадного списку "Unicode String [DT_WSTR]". Потім мені довелося зайти в цільовий компонент і картографувати щойно перетворені стовпці на мій файл excel.

Моє запитання: якщо хтось інший натрапив на це, чи є кращий більш ефективний спосіб обійти необхідність зробити всі ручні перетворення типів даних? Перетворення та картографування всіх стовпців один за одним не здається практичним, особливо якщо у вас є велика кількість рядків.

Я розумію, що файли excel - це не найкращий спосіб імпорту та експорту даних, але саме в цьому випадку потрібно.

Я можу шукати спосіб просто експортувати в плоский текстовий файл, а потім спробувати перетворити в excel як останній крок у пакеті. Я скачу, що це звичайне запускає ту саму помилку перетворення unicode / nonunicode.


як ваш синдром зап'ястного каналу після цього? :-)
Патрік Онорез

Переконайтеся, що таблиця, в яку ви переміщуєте дані, використовує типи даних Unicode (тобто: nvarchar (50) замість varchar (50))
MacGyver

Відповіді:


15

Як альтернатива RDC, я просто пропустив би перетворення типів даних у SSIS і явно подав їх як nvarchar у своєму вихідному запиті.

Використання

У вихідному запиті (і ви будете з допомогою запиту джерела і НЕ просто вибрати таблицю зі списку), явно привести речі у відповідному п (вар) довжину напівкоксу.

Замість

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 ComponentSSIS
  • Ні RSI . Не потрібно клацати N разів і вказувати всю цю інформацію в жахливому маленькому редакторі, який вони надають. Я б використав запит проти dmv / information_schema для подальшої автоматизації генерації експорту таблиць "Excel готовий".
  • Немає спеціальної установки компонентів. Я працював у місцях, де встановлення відкритого коду було багатослівним. Існує також відкладена вартість технічного обслуговування для встановлення сторонніх додатків, оскільки зараз "всім" потрібно встановити цей самий додаток для підтримки вашого коду, і його потрібно встановити на сервери, і infosec потрібно перевірити збірки, щоб переконатися, що вони дійсні і нам потрібні виписки від мільйона людей, які випередили вас ...

1
"Як альтернатива RDC" - Що таке RDC? Коли я читаю про наступну відповідь, я думаю, ви можете мати на увазі заміну компонента даних, але оскільки автор оригінальної публікації не згадав про цей компонент, це може бути занадто рано для абревіатури. :-)
Thronk

говорячи про RSI, CONVERTслід легше вставити 50 разів CAST, оскільки аргументи
передують


2

Якщо вам потрібно лише перейти з "рядок Unicode (DT_WSTR)" на "рядок (DT_STR)" або навпаки, ви можете зробити це:

  1. Збережіть копію файлу package.dtsx- (у випадку, якщо його потрібно відновити)
  2. Відкрийте package.dtsx в редакторі або в MS Visual Studio клацніть правою кнопкою миші на пакет і виберіть "Переглянути код". Ви побачите XML-файл.

Шукайте рядок, DTS:DataTypeякщо за ним слідує = "130", стовпець визначається як DT_WSTR (unicode).

Якщо за ним слідує = "129", то стовпець визначається як DT_STR (non-unicode), використовуйте пошук і замініть обережно (ви робили копію раніше, чи не так?)

Збережіть файл і, можливо, це було все.


1
Ласкаво просимо на DBA SE! Порада: на сайті є різні функції форматування тексту, щоб покращити публікації. Використовуйте піктограми у верхній частині текстового поля редактора.
петерх
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.