Conversione di stringa non Unicode in SSIS stringa Unicode


9

Sto creando un pacchetto in cui esporterò i dati da un database in un file Excel vuoto. Quando ho aggiunto solo i componenti di origine e destinazione e ho eseguito il pacchetto ho ricevuto un errore di conversione che indicava che la colonna di output e la colonna "A" non sono in grado di convertire tra tipi di dati stringa unicode e non unicode.

Per risolvere questo problema ho aggiunto un componente di conversione dei dati e convertito tutte le colonne in

"Stringa Unicode [DT_WSTR]"

e non ho più ricevuto l'errore. L'unico problema è che avevo circa 50 colonne in cui dovevo andare 1 per 1 e selezionare "Unicode String [DT_WSTR]" dall'elenco a discesa. Ho quindi dovuto andare nel componente di destinazione e mappare le colonne appena convertite nel mio file Excel.

La mia domanda è, se qualcun altro si è imbattuto in questo, c'è un modo migliore e più efficiente per aggirare dover fare tutte le conversioni manuali del tipo di dati? Dover convertire e mappare tutte le colonne una per una non sembra pratico soprattutto se hai un gran numero di righe.

Capisco che i file Excel non sono il modo migliore per importare ed esportare dati, ma è ciò che è richiesto in questo caso particolare.

Potrei cercare un modo per esportare in un file di testo semplice e quindi provare a convertire in Excel come ultimo passo nel pacchetto. Sto saltando questo non attiverà lo stesso errore di conversione unicode / nonunicode.


come è il tuo tunnel carpale dopo quello? :-)
Patrick Honorez,

Assicurati che la tabella in cui sposti i dati utilizzi i tipi di dati Unicode (es: nvarchar (50) invece di varchar (50))
MacGyver

Risposte:


15

In alternativa a RDC, saltai semplicemente la conversione dei tipi di dati in SSIS e li espressi esplicitamente come nvarchar nella mia query di origine.

uso

Nella vostra query di origine (e si sta utilizzando una query di origine e non semplicemente selezionando il tavolo in giù goccia), espressi in modo esplicito le cose ad un appropriato n (var) char lunghezza.

Invece di

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

usa una query come

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

Gli astuti studenti di AdventureWorks riconosceranno che i dati erano già un n(var)chartipo, ma questo era semplicemente per dimostrare il concetto.

Benefici

  • Meno memoria utilizzata. Attualmente, dovresti allocare e archiviare due copie degli "stessi" dati utilizzando Data Conversion ComponentSSIS
  • No RSI . Non c'è bisogno di fare clic N volte e specificare tutte quelle informazioni nel terribile editor che forniscono. Userei una query contro dmv / information_schema per automatizzare ulteriormente la generazione di esportazioni di tabelle "Excel ready".
  • Nessuna installazione di componenti personalizzati. Ho lavorato in luoghi in cui l'installazione dell'open source era verboten. C'è anche un costo di manutenzione differito per l'installazione di app di terze parti poiché ora "tutti" devono installare quella stessa app per mantenere il codice e deve essere installato sui server e infosec deve esaminare attentamente gli assembly per assicurarsi che siano validi e abbiamo bisogno degli acquisti di un bajillion di persone che ti superano ...

1
"In alternativa a RDC" - Che cos'è RDC? Quando leggo la prossima risposta, penso che potresti voler dire Sostituzione di un componente di dati, ma poiché l'autore del post originale non ha menzionato quel componente, potrebbe essere troppo presto per un acronimo. :-)
Thronk,

parlando di RSI, CONVERTdovrebbe essere più facile incollare 50 volte rispetto a CAST, poiché gli argomenti sono in primo piano
Patrick Honorez,


2

Se devi solo passare da "stringa Unicode (DT_WSTR)" a "stringa (DT_STR)" o viceversa, potresti fare questo:

  1. Salvare una copia del file package.dtsx- (nel caso sia necessario ripristinare)
  2. Apri package.dtsx in un editor o in MS Visual Studio fai clic con il pulsante destro del mouse sul pacchetto e scegli "Visualizza codice". Vedrai un file XML.

Cerca la stringa DTS:DataTypese è seguita da = "130", quindi la colonna viene definita come DT_WSTR (unicode).

Se è seguito da = "129", la colonna viene definita come DT_STR (non unicode), usa la ricerca e sostituisci con cura (hai già fatto una copia prima, vero?)

Salva il file e forse era così.


1
Benvenuto su DBA SE! Suggerimento professionale: il sito ha varie funzionalità di formattazione del testo per rendere i tuoi post più belli. Usa le icone nella parte superiore della casella di testo dell'editor.
Peter - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.