none
file import ausserhalb des servers RRS feed

  • Allgemeine Diskussion

  • Folgende aufgabe wurde mir übergeben.

    Ich soll ein File aus einem anderen Server Kopieren und in temporäre tabelle auf dem anderen server speichern. Die tabellen im file sind mit whitespace getrennt. 

    ich habe gute kenntnisse in mysql jedoch nicht mit SQL Server 2008 R2. Wie realisiere ich dies?

    Mittwoch, 7. November 2012 09:41

Alle Antworten

  • Hi,

    nur, um Missverständnisse zu vermeiden:

    Was ist bei dir ein "File"?

    Was sind bei dir "Tabellen"?

    Ein "File" ist in der Regel eine Datei. Eine Tabelle in der Regel halt eine Tabelle.

    Deine Beschreibung hört sich aber eher so an, als ob Du in diesem "File" die Datensätze vorhältst und die einzelnen Werte mit Leerzeichen(?) separiert sind.

    Poste doch mal bitte die ersten paar Zeilen einer solchen Datei. Dann kann man sich das mal anschauen.

    BTW: Eine temporäre Tabelle hat, wie der Name schon sagt, die Eigenschaft, dass sie eben nur temporär vorhanden ist. Wenn die Daten nach Abschluss deines Imports noch irgendwo benötigt werden, geht das wahrscheinlich besser mit einer normalen, also nicht temporären Tabelle.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 7. November 2012 10:19
    Moderator
  • Und falls Du es nur einmal brauchst, kannst Du im Management Studio im Kontextmenü der Datenbank über Tasks und "Daten importieren" einen Assistenten dafür starten.

    Alternativ schaue Dir die "SQL Server Integration Services" an, die hier im Hintergrund aktiv werden.
    Manchmal ist es besser, alle Daten in ein großes Feld zu importieren und die Daten erst später über T-SQL zu separieren.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Mittwoch, 7. November 2012 12:59
  • hallo stefan

    Also tabelle sind tabellen und file ist ein csv file mit leerzeichen getrennt. diese files liegen auf einem anderen server auf einem freigegeben Pfad. eine zeile davon sieht so aus. Aus datenschutzlinien muss ich die daten manipulieren also sie sind nicht original

    4744837G744837 Peter        Muster        11111111  EM0009193159062012311299990431    BLAB 12

    es hat noch mehr spalten, welche aber unwichtig sind.

    das ganze muss ich via SP machen welcher täglich lauft. die Tabelle muss erstellt werden und danach wieder gelöst, desshalb eine temp tabelle.

    ich muss also vorerst mal wissen wie ich dieses csv file vom anderen server erhalte.
    Mittwoch, 7. November 2012 13:03
  • Hallo,
    Zuächst solltest Du festlegen wie die Datei in den Zugriff des SQL -Servers und damit deiner Stored Procedure kommt. Das soll ein Zugriff im Netz sein.
    Eine Stelle an die der SQL-Server herankommt. 
    Das wäre also ein Job der die Datei kopiert so das sie verarbeitet werden kann, bevor deine SP aufgerufen wird. FTP drängt sich hier auf.
    Ist die Datei dann Zugreifbar soll ein einfaches BulkInsert die Sache erledigen.
    Beispiele findest Du hierzu reichlich z.B. http://msdn.microsoft.com/de-de/library/ms175915.aspx
    Der Bulk Insert des SQL-Servers ist das Load data Infile des mySQL. Der Rest ist für beide gleich: FTP, oder ein anderer Transportweg.

    Grüße Alexander

    Donnerstag, 8. November 2012 12:58
  • Genau so habe ich es auch gemacht. die Datei befindet sich auf dem Server welche ich importieren möchte. diese möchte ich nun einlesen mit BULK INSERT

    leider habe ich gesehen dass das trennzeichen und der zeilenumbruch ein oder mehrere leerschläge sind. Meine frage ist wie bringe ich diese leerzeichen raus (LTRIM und RTRIM?) und wie weiss ich wann eine neue Zeile kommt? \n oder \r funktioniert nicht, da es ja ein leehrschlag ist. immer beim zeichen 364 ist die zeile zu ende.

    ein weiterer versuch an dem ich bin ist das ganze mit c# zu realisieren. also ein assembly zu machen und dies dan darüber zu lösen

    Freitag, 9. November 2012 09:57
  • Hallo (gruezi) Stefan,
    Bulk Insert ist extrem mächtig. Nur deine Inputdatei sieht ein wenig speziell aus. Leerzeichen als Trenner sind nun nicht das was man an jeder Ecke zu finden glaubt. Ist es möglich das ein fixer Aufbau existiert - 10 Zeichen spalte A - 20 zeichen Spalte B u.s.w. ? Ist dem So ist die Frage nach der nächsten Zeile geklärt.
    Versuche die Datei doch mal z.B. in MS Access zu importieren.
    Klappt das ist der Aufbau wohl koscher und es soll möglich sein das auch mit Bulk Insert hinzubekommen.
    Am Zeilenende hast Du unsichtbare Steuerzeichen sicher kein Leerschlag. Schau Dir das mal mit einem Texteditor wie UltraEdit an.
    Der kennt die Hexadezimale Darstellung dort siehst Du dann alles was sich sonst vor Dir versteckt.

    Grüße Alexander

    Samstag, 10. November 2012 14:06
  • Genau das ist so. leider kommen diese Daten vom HR aus irgendwelchen zusammengesetzten Daten von der Datenbank. Das File hat immer den selben aufbau und hat immer die gleichen abstände. von dem her gesehen kann ich diese immer gleich abhandeln. aber wie in SQL?

    Weitere Frage ist, ich habe nun das ganze in ein c# file gepackt. Funktioniert eigentlich nur gibt es da eine Fehlermeldung

    Msg 6522, Level 16, State 1, Procedure sp_LMimport, Line 0
    A .NET Framework error occurred during execution of user-defined routine or aggregate "sp_LMimport": 
    System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
    System.Security.SecurityException: 
       at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
       at System.Security.PermissionSet.Demand()
       at System.Data.Common.DbConnectionOptions.DemandPermission()
       at System.Data.SqlClient.SqlConnection.PermissionDemand()
       at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.SqlClient.SqlConnection.Open()
       at StoredProcedures.import()
    
    Hat wer da vieleicht einer eine lösung?


    Dienstag, 13. November 2012 09:47
  • Hallo Stefan,
    was meinst Du mit die gleichen Abstände? Meinst Du das die Daten immer an der gleichen Spaltenposition beginnen? In jeder Zeile?
    Wenn das so ist: http://msdn.microsoft.com/de-de/library/ms188365.aspx

    Dort hast Du ein Beispiel für einen Bulk Insert Beispiel zum importieren von Daten aus Dateien mit fixer Spaltenbreite.
    Zunächst erzeugst Du eine Formatdatei, diese Enthält die Spaltenbreiten, danach kommt der Bulk Insert mit der Angabe der Quelldatei und der Formatdatei.
    HTH

    Grüße Alexander

    Mittwoch, 14. November 2012 07:06
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 5. Dezember 2012 14:20
    Moderator