Welcome
Guest
, you are in:
<root>
•
Anmelden
CP Wiki
Navigation
¶
CP Solutions
Startseite
domizil+
Startseite
Administration
Administration
Neue Seite
Alle Seiten
Kategorien
Navigations-Pfade
Datei Manager
Neuer Benutzer
Suche im wiki
»
Zurück
Binäre Dateien Importieren und Exportieren
Modified on 16/06/2009 13:53
by Manuel Siebert
Categorized as
Nicht kategorisiert
((([image| |http://www.cp-austria.at/website/DesktopModules/Wiki/images/Home.gif|MainPage] » [MainPage|Startseite] » [netFramePlattform|netFrame als Plattform Menü] » [TippsundTricks|Tipps und Tricks] » Binäre Dateien Importieren und Exportieren | {searchbox} [Search.aspx?FullText=1|Erweiterte Suche]))) {BR} *[#1|Dateipfadtabelle und out.txt vorbereiten] *[#2|Laden der Dateien] *[#3|Prozedur laden] *[#4|Exportieren der Daten aus der Datenbank] *[#5|Export Prozedur] {BR} '''1.''' Dieses Beispiel zeigt wie man binäre Dateien Im- und Exportieren kann.{BR} *'''Dateipfadtabelle und out.txt vorbereiten:'''[anchor|#1] {BR}{BR} * Wir beginnen mit der Datei die den absoluten Pfad der Binärdateien enthält. Als Beispiel nehmen wir die Dateiendung .dat{BR}{BR} {{{{find d:\binary -name *.dat -type f > out.txt}}}}{BR}{BR} * Dies erstellt die Datei out.txt mit dem Dateinamen die in dem Ordner d:\binary enthalten sind.{BR} * Nun erstellen wir eine Tabelle.{BR}{BR} <code sql>CREATE TABLE files (filepath varchar(512), --file_id INT IDENTITY(1,1) )</code>{BR}{BR} * 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.{BR}{BR} <code sql>BULK INSERT files FROM 'd:\out.txt' WITH ( --fieldterminator='', rowterminator='\n'; </code>{BR}{BR} * Wenn später benötigt können Sie '''Constraints, Indexes oder IDENTITY''' Spalten hinzufügen um die Geschwindigkeit der Select Prozeduren zu erhöhen.{BR}{BR}{BR} * '''Laden der Dateien:[anchor|#2]'''{BR}{BR} * Meiner Meinung nach sollten Sie vor jeder '''BULK''' Operation das Datenbank Recovery Model auf '''SIMPLE''' oder '''BULK_LOGGED''' '''ALTER'''n, wenn Sie diesen Aufwand betreiben möchten und den '''INDEX''' in der '''bindata''' Datenbank deaktivieren '''(file_id_idx)''' wollen, führen Sie folgendes aus:{BR}{BR} <code sql>CREATE TABLE bindata (data varbinary(max), --file_id INT IDENTITY(1,1) ) /* CREATE NONCLUSTERED INDEX file_id_idx ON bindata (file_id) */ </code>{BR}{BR} * '''Prozedur laden:'''[anchor|#3]{BR}{BR} <code sql>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;</code>{BR}{BR} * Der Prozess zum Laden der Daten hängt natürlich von der Anzahl und Größe aller Dateien die Sie laden wollen ab.{BR}{BR}{BR} * '''Exportieren der Daten aus der Datenbank:[anchor|#5]'''{BR}{BR} * Um die Daten zu exportieren benutzen wir das folgende Script, um dieses Script zu benutzen müssen wir es zuvor aktivieren.{BR}{BR} <code sql>EXEC sp_configure 'xp_cmdshell', 1 GO RECONFIGURE GO</code>{BR}{BR} * Um mehr über die '''[http://technet.microsoft.com/en-us/library/ms190693.aspx|xp_cmdshell]''' zu lesen, klicken Sie bitte '''[http://technet.microsoft.com/en-us/library/ms190693.aspx|hier]'''{BR}{BR}{BR} * '''Export Prozedur[anchor|#4]:'''{BR}{BR} <code sql>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;</code>{BR}{BR}
ScrewTurn Wiki
version 3.0.1.400. Some of the icons created by
FamFamFam
.