Convertendo seqüência de caracteres não Unicode em seqüência de caracteres Unicode SSIS

9

Estou criando um pacote no qual exportarei dados de um banco de dados para um arquivo excel vazio. Quando adicionei apenas os componentes de origem e destino e executei o pacote, recebi um erro de conversão informando que a coluna Saída e a coluna "A" não podem ser convertidas entre os tipos de dados de seqüência de caracteres unicode e não-unicode.

Para corrigir isso, adicionei um componente de conversão de dados e converti todas as colunas em

"Cadeia Unicode [DT_WSTR]"

e eu não recebi mais o erro. O único problema é que eu tinha cerca de 50 colunas onde precisei 1 por 1 e selecione "Unicode String [DT_WSTR]" na lista suspensa. Eu tive que ir para o componente de destino e mapear as colunas recém-convertidas para o meu arquivo do Excel.

Minha pergunta é: se alguém já se deparou com isso, existe uma maneira melhor e mais eficiente de evitar ter que fazer todas as conversões manuais de tipo de dados? Ter que converter e mapear todas as colunas uma por uma não parece prático, especialmente se você tiver um grande número de linhas.

Entendo que os arquivos do Excel não são a melhor maneira de importar e exportar dados, mas é o que é necessário nesse caso específico.

Eu poderia procurar uma maneira de exportar para um arquivo de texto simples e tentar converter para o Excel como um último passo no pacote. Espero que isso não acione o mesmo erro de conversão unicode / nonunicode.

Juan Velez
fonte
como está sua síndrome do túnel do carpo depois disso? :-)
Patrick Honorez
Certifique-se a tabela que você mover dados para está usando tipos de dados Unicode (ou seja: nvarchar (50) em vez de varchar (50))
MacGyver

Respostas:

15

Como alternativa ao RDC, eu apenas pularia a conversão dos tipos de dados no SSIS e os converteria explicitamente como nvarchar na minha consulta de origem.

Uso

Na sua consulta de origem (e você está usando uma consulta de origem e não simplesmente selecionando a tabela na lista suspensa), expanda explicitamente as coisas para um comprimento apropriado de n (var) char.

Ao invés de

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

use uma 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

Os alunos astutos da AdventureWorks reconhecerão que os dados já eram do n(var)chartipo, mas isso foi apenas para demonstrar o conceito.

Benefícios

  • Menos memória usada. Atualmente, você alocaria e armazenaria duas cópias dos "mesmos" dados usando o Data Conversion Componentno SSIS
  • Sem RSI . Não é necessário clicar N vezes e especificar todas essas informações no péssimo editor que eles fornecem. Eu usaria uma consulta no dmv / information_schema para automatizar ainda mais a geração de exportação de tabela "pronta para Excel".
  • Nenhuma instalação de componente personalizado. Eu trabalhei em lugares onde a instalação de código aberto era verboten. Há também um custo de manutenção diferido para a instalação de aplicativos de terceiros, pois agora "todos" precisam instalar o mesmo aplicativo para manter seu código e precisam ser instalados nos servidores, e a infosec precisa examinar os assemblies para garantir que eles sejam válidos e precisamos de aprovação de um bajilhão de pessoas que superam você ...
billinkc
fonte
11
"Como alternativa à RDC" - O que é a RDC? Quando li a próxima resposta, acho que você pode estar substituindo o componente de dados, mas como o autor da postagem original não mencionou esse componente, pode ser muito cedo para um acrônimo. :-)
Thronk 13/09/2013
falando sobre RSI, CONVERTdeve ser mais fácil para colar 50 vezes do que CAST, uma vez que os argumentos estão na frente
Patrick Honorez
2

Se você precisar alterar apenas de "Cadeia de caracteres Unicode (DT_WSTR)" para "Cadeia de caracteres (DT_STR)" ou vice-versa, faça o seguinte:

  1. Salve uma cópia do seu arquivo package.dtsx- (no caso de você precisar recuperar)
  2. Abra o package.dtsx em um editor ou, no Microsoft Visual Studio, clique com o botão direito do mouse no pacote e escolha "View Code". Você verá um arquivo XML.

Procure a sequência DTS:DataTypese for seguida por = "130", a coluna é definida como DT_WSTR (unicode).

Se for seguido por = "129", a coluna é definida como DT_STR (não unicode), use a pesquisa e substitua com cuidado (você fez uma cópia antes, não fez?)

Salve o arquivo e talvez seja isso.

cjonas
fonte
11
Bem-vindo ao DBA SE! Dica profissional: o site possui vários recursos de formatação de texto para melhorar a aparência de suas postagens. Use os ícones na parte superior da caixa de texto do editor.
peterh - Restabelece Monica