Преобразование строки без Юникода в строку Юникода SSIS

9

Я создаю пакет, в который я буду экспортировать данные из базы данных в пустой файл Excel. Когда я добавил только исходный и целевой компоненты и запустил пакет, я получил ошибку преобразования, в которой указано, что столбец вывода и столбец «A» не могут преобразовывать строковые типы данных в Юникоде и не в Юникоде.

Чтобы это исправить, я добавил компонент преобразования данных и преобразовал все столбцы в

"Строка 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 ready".
  • Нет пользовательских компонентов установки. Я работал в местах, где установка с открытым исходным кодом была verboten. Существует также отложенная стоимость обслуживания для установки сторонних приложений, так как теперь «каждый» должен установить это же приложение для поддержки вашего кода, и его нужно установить на серверах, а infosec нужно тщательно изучить сборки, чтобы убедиться в их работоспособности. и нам нужны подписи от людей, которые опередили вас ...
billinkc
источник
1
«Как альтернатива RDC» - что такое RDC? Когда я читаю следующий ответ, я думаю, что вы имеете в виду «Замена компонента данных», но, поскольку автор исходного поста не упомянул этот компонент, может быть слишком рано для аббревиатуры. :-)
Тронк
Говоря о 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 (не в Юникоде), используйте поиск и замену с осторожностью (вы делали копию раньше, не так ли?)

Сохраните файл и, возможно, это все.

cjonas
источник
1
Добро пожаловать на DBA SE! Совет для профессионалов: на сайте есть различные функции форматирования текста, чтобы ваши сообщения выглядели лучше. Используйте значки в верхней части текстового поля редактора.
Петер - Восстановить Монику