Konvertieren einer Nicht-Unicode-Zeichenfolge in eine Unicode-Zeichenfolge SSIS

9

Ich erstelle ein Paket, in das ich Daten aus einer Datenbank in eine leere Excel-Datei exportieren werde. Wenn ich nur die Quell- und Zielkomponenten hinzufügte und das Paket ausführte, wurde ein Konvertierungsfehler angezeigt, der besagte, dass die Ausgabespalte und die Spalte "A" nicht zwischen Unicode- und Nicht-Unicode-Zeichenfolgendatentypen konvertieren können.

Um dies zu beheben, habe ich eine Datenkonvertierungskomponente hinzugefügt und alle Spalten in konvertiert

"Unicode-Zeichenfolge [DT_WSTR]"

und ich habe den Fehler nicht mehr erhalten. Das einzige Problem ist, dass ich ungefähr 50 Spalten hatte, in denen ich 1 zu 1 gehen und "Unicode String [DT_WSTR]" aus der Dropdown-Liste auswählen musste. Ich musste dann in die Zielkomponente gehen und die neu konvertierten Spalten meiner Excel-Datei zuordnen.

Meine Frage ist, ob jemand anderes darauf gestoßen ist. Gibt es einen effizienteren Weg, um alle manuellen Datentypkonvertierungen durchzuführen? Es scheint nicht praktisch zu sein, alle Spalten einzeln zu konvertieren und zuzuordnen, insbesondere wenn Sie eine große Anzahl von Zeilen haben.

Ich verstehe, dass Excel-Dateien nicht der beste Weg sind, um Daten zu importieren und zu exportieren, aber dies ist in diesem speziellen Fall erforderlich.

Ich könnte nach einer Möglichkeit suchen, einfach in eine flache Textdatei zu exportieren und dann als letzten Schritt im Paket zu versuchen, in Excel zu konvertieren. Ich hoffe, dass dies nicht den gleichen Unicode / Nonunicode-Konvertierungsfehler auslöst.

Juan Velez
quelle
Wie ist Ihr Karpaltunnelsyndrom danach? :-)
Patrick Honorez
Stellen Sie sicher, dass die Tabelle, in die Sie Daten verschieben, Unicode-Datentypen verwendet (dh: nvarchar (50) anstelle von varchar (50))
MacGyver

Antworten:

15

Als Alternative zu RDC überspringe ich einfach die Konvertierung der Datentypen in SSIS und wandle sie in meiner Quellabfrage explizit als nvarchar um.

Verwendungszweck

In Ihrer Quellabfrage (und Sie werden mit einer Quellabfrage und nicht einfach die Tabelle in der Drop - Down - Auswahl), explizit werfen Dinge auf einen geeigneten n (var) char Länge.

Anstatt

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

Verwenden Sie eine Abfrage wie

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

Die klugen Schüler von AdventureWorks werden erkennen, dass die Daten bereits ein n(var)charTyp waren, dies diente jedoch lediglich der Demonstration des Konzepts.

Leistungen

  • Weniger Speicher belegt. Derzeit würden Sie zwei Kopien der "gleichen" Daten mithilfe von Data Conversion Componentin SSIS zuweisen und speichern
  • Kein RSI . Sie müssen nicht N-mal klicken und all diese Informationen in dem schrecklichen kleinen Editor angeben, den sie bereitstellen. Ich würde eine Abfrage für das dmv / information_schema verwenden, um die Generierung von "Excel ready" -Tabellenexporten weiter zu automatisieren.
  • Keine benutzerdefinierte Komponenteninstallation. Ich habe an Orten gearbeitet, an denen die Installation von Open Source verboten war. Die Installation von Apps von Drittanbietern verursacht auch verzögerte Wartungskosten, da jetzt "jeder" dieselbe App installieren muss, um Ihren Code zu verwalten, und sie auf den Servern installiert werden muss und infosec die Assemblys überprüfen muss, um sicherzustellen, dass sie gültig sind und wir brauchen Abmeldungen von einem Bajillion Volk, das Ihnen überlegen ist ...
billinkc
quelle
1
"Als Alternative zu RDC" - Was ist RDC? Wenn ich zur nächsten Antwort weiterlese, denke ich, dass Sie möglicherweise das Ersetzen von Datenkomponenten bedeuten, aber da der Autor des ursprünglichen Beitrags diese Komponente nicht erwähnt hat, ist sie möglicherweise zu früh für ein Akronym. :-)
Thronk
Wenn man über RSI spricht, CONVERTsollte es einfacher sein, 50 Mal CAST
einzufügen
2

Wenn Sie nur von "Unicode-Zeichenfolge (DT_WSTR)" zu "Zeichenfolge (DT_STR)" oder umgekehrt wechseln müssen, können Sie dies tun:

  1. Speichern Sie eine Kopie Ihrer package.dtsx-Datei (falls Sie sie wiederherstellen müssen)
  2. Öffnen Sie die package.dtsx in einem Editor oder klicken Sie in MS Visual Studio mit der rechten Maustaste auf das Paket und wählen Sie "Code anzeigen". Sie sehen eine XML-Datei.

Suchen Sie nach der Zeichenfolge, DTS:DataTypewenn = "130" folgt, und die Spalte wird als DT_WSTR (Unicode) definiert.

Wenn darauf = "129" folgt, ist die Spalte als DT_STR (Nicht-Unicode) definiert. Verwenden Sie Suchen und Ersetzen mit Sorgfalt (Sie haben zuvor eine Kopie erstellt, oder?)

Speichern Sie die Datei und vielleicht war es das.

cjonas
quelle
1
Willkommen auf der DBA SE! Pro-Tipp: Die Website verfügt über verschiedene Textformatierungsfunktionen, damit Ihre Beiträge besser aussehen. Verwenden Sie die Symbole oben im Editor-Textfeld.
Peter - Wiedereinstellung Monica