Welcome Guest, you are in: Anmelden

CP Wiki

RSS RSS

Navigation



  1. Administration

Suche im wiki
»
 » Startseite » netFrame als Plattform Menü » Tipps und Tricks » Binäre Dateien Importieren und Exportieren | » Erweiterte Suche



1. Dieses Beispiel zeigt wie man binäre Dateien Im- und Exportieren kann.


  • Dateipfadtabelle und out.txt vorbereiten:

  • Wir beginnen mit der Datei die den absoluten Pfad der Binärdateien enthält. Als Beispiel nehmen wir die Dateiendung .dat


    find d:\binary -name *.dat -type f > out.txt

  • Dies erstellt die Datei out.txt mit dem Dateinamen die in dem Ordner d:\binary enthalten sind.
  • Nun erstellen wir eine Tabelle.


    CREATE TABLE files
    (filepath varchar(512),
    file_id INT IDENTITY(1,1)
    )


  • Sie können die Größe des VARCHAR Felds beliebig angeben, denken Sie daran, dass in diesem Feld der Pfad inkl. dem kompletten Dateinamen gespeichert wird.
  • Wir laden die Dateipfade mit folgender Anweisung.


    BULK INSERT files
    FROM 'd:\out.txt'
    WITH (
    fieldterminator='',
    rowterminator='\n';


  • Wenn später benötigt können Sie Constraints, Indexes oder IDENTITY Spalten hinzufügen um die Geschwindigkeit der Select Prozeduren zu erhöhen.


  • Laden der Dateien:

  • Meiner Meinung nach sollten Sie vor jeder BULK Operation das Datenbank Recovery Model auf SIMPLE oder BULK_LOGGED ALTERn, wenn Sie diesen Aufwand betreiben möchten und den INDEX in der bindata Datenbank deaktivieren (file_id_idx) wollen, führen Sie folgendes aus:


    CREATE TABLE bindata
    (data varbinary(max),
    file_id INT IDENTITY(1,1)
    )

/* CREATE NONCLUSTERED INDEX file_id_idx ON bindata (file_id)
  • /


  • Prozedur laden:


    DECLARE
    @filename VARCHAR(512),
    @sql VARCHAR(512);
    DECLARE a_cur CURSOR STATIC FOR
    SELECT filepath FROM files;
    /*WHERE file_id >(SELECT MAX(file_id) FROM bindata); This part is needed when you load the data NOT for the first time from the files table. */

OPEN a_cur FETCH NEXT FROM a_cur INTO @filename; WHILE (@@fetch_status=0) BEGIN
using dynamic sql in order to use the @filename variable SET @sql ='INSERT INTO bindata(data) SELECT * FROM OPENROWSET(BULK + @filename+, SINGLE_BLOB) as f;' EXEC (@sql); FETCH NEXT FROM a_cur INTO @filename; END; CLOSE a_cur; DEALLOCATE a_cur;

  • Der Prozess zum Laden der Daten hängt natürlich von der Anzahl und Größe aller Dateien die Sie laden wollen ab.


  • Exportieren der Daten aus der Datenbank:

  • Um die Daten zu exportieren benutzen wir das folgende Script, um dieses Script zu benutzen müssen wir es zuvor aktivieren.


    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO


  • Um mehr über die xp_cmdshell zu lesen, klicken Sie bitte hier


  • Export Prozedur :


    DECLARE
    @a INT
    DECLARE @i INT,
    @filename VARCHAR(300),
    @cmd VARCHAR(500)
    SET @i = 0;

SELECT @a=max(file_id) from bindata; -- for speeding up this query abit you may want to create and INDEX on file_id WHILE @i != @a BEGIN

SET @filename = 'd:\tmp\'+CAST (@i AS VARCHAR)+'.dat'; SELECT @filename; SET @cmd = 'bcp "SELECT data FROM db1.dbo.bindata WHERE file_id='+ CAST(@i+1 AS VARCHAR)+'" queryout '+@filename+' -T -N'; EXEC master..xp_cmdshell @cmd; SET @i=@i+1; END;


ScrewTurn Wiki version 3.0.1.400. Some of the icons created by FamFamFam.