Conversión de cadenas no Unicode a cadenas Unicode SSIS

9

Estoy creando un paquete donde exportaré datos de una base de datos a un archivo de Excel vacío. Cuando agregué solo los componentes de origen y destino y ejecuté el paquete, recibí un error de conversión que indica que la columna de salida y la columna "A" no pueden convertir entre tipos de datos de cadena unicode y no unicode.

Para solucionar esto, agregué un componente de conversión de datos y convertí todas las columnas a

"Cadena Unicode [DT_WSTR]"

y ya no recibí el error. El único problema es que tenía unas 50 columnas donde tenía que ir 1 por 1 y seleccionar "Cadena Unicode [DT_WSTR]" de la lista desplegable. Luego tuve que ir al componente de destino y asignar las columnas recién convertidas a mi archivo de Excel.

Mi pregunta es, si alguien más se ha encontrado con esto, ¿hay alguna forma mejor y más eficiente de evitar tener que hacer todas las conversiones manuales de tipos de datos? Tener que convertir y mapear todas las columnas una por una no parece práctico, especialmente si tiene una gran cantidad de filas.

Entiendo que los archivos de Excel no son la mejor manera de importar y exportar datos, pero es lo que se requiere en este caso particular.

Podría buscar una forma de exportar a un archivo de texto plano y luego intentar convertir a Excel como último paso en el paquete. Espero que esto no desencadene el mismo error de conversión unicode / nonunicode.

Juan velez
fuente
¿Cómo es su síndrome del túnel carpiano después de eso? :-)
Patrick Honorez
Asegúrese de que la tabla a la que mueve los datos utiliza tipos de datos Unicode (es decir: nvarchar (50) en lugar de varchar (50))
MacGyver

Respuestas:

15

Como alternativa a RDC, simplemente omitiría la conversión de los tipos de datos en SSIS y los convertiría explícitamente como nvarchar en mi consulta de origen.

Uso

En su consulta de origen (y está utilizando una consulta de origen y no simplemente seleccionando la tabla en el menú desplegable), convierta explícitamente las cosas a una longitud de caracteres n (var) apropiada.

En vez de

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

usar una consulta como

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

Los astutos estudiantes de AdventureWorks reconocerán que los datos ya eran un n(var)chartipo, pero esto fue simplemente para demostrar el concepto.

Beneficios

  • Menos memoria utilizada. Actualmente, estaría asignando y almacenando dos copias de los "mismos" datos utilizando Data Conversion ComponentSSIS
  • Sin RSI . No es necesario hacer clic N veces y especificar toda esa información en el pequeño editor horrible que proporcionan. Usaría una consulta contra dmv / information_schema para automatizar aún más la generación de exportaciones de tablas "listas para Excel".
  • Sin instalación de componentes personalizados. He trabajado en lugares donde la instalación de código abierto fue verboten. También hay un costo de mantenimiento diferido para instalar aplicaciones de terceros, ya que ahora "todos" necesitan instalar esa misma aplicación para mantener su código y deben instalarse en los servidores y Infosec necesita examinar los ensambles para asegurarse de que sean válidos y necesitamos aprobaciones de miles de millones de personas que te superan ...
billinkc
fuente
1
"Como alternativa a RDC" - ¿Qué es RDC? Cuando siga leyendo la siguiente respuesta, creo que puede querer decir Reemplazar componente de datos, pero como el autor de la publicación original no mencionó ese componente, podría ser demasiado pronto para un acrónimo. :-)
Thronk
hablando de RSI, CONVERTdebería ser más fácil pegar 50 veces que CAST, ya que los argumentos están al frente
Patrick Honorez
2

Si solo tiene que cambiar de "cadena Unicode (DT_WSTR)" a "cadena (DT_STR)" o viceversa, puede hacer esto:

  1. Guarde una copia de su archivo package.dtsx (en el caso de que deba recuperarlo)
  2. Abra el paquete.dtsx en un editor, o en MS Visual Studio, haga clic derecho en el paquete y elija "Ver código". Verá un archivo XML.

Busque la cadena DTS:DataTypesi es seguida por = "130", luego la columna se define como DT_WSTR (unicode).

Si es seguido por = "129", entonces la Columna se define como DT_STR (no unicode), use la búsqueda y reemplace con cuidado (hizo una copia antes, ¿no?)

Guarde el archivo y tal vez esto fue todo.

cjonas
fuente
1
¡Bienvenido al DBA SE! Consejo profesional: el sitio tiene varias características de formato de texto para que tus publicaciones se vean mejor. Use los iconos en la parte superior del cuadro de texto del editor.
peterh - Restablece a Mónica el