{"id":3432,"date":"2009-08-25T18:19:16","date_gmt":"2009-08-25T16:19:16","guid":{"rendered":"http:\/\/www.glorf.it\/blog\/?p=3432"},"modified":"2009-08-14T21:25:33","modified_gmt":"2009-08-14T19:25:33","slug":"mit-sql-server-text-dateien-schreiben","status":"publish","type":"post","link":"http:\/\/www.glorf.it\/blog\/2009\/08\/25\/sql-talk\/mit-sql-server-text-dateien-schreiben","title":{"rendered":"Mit SQL Server Text-Dateien schreiben"},"content":{"rendered":"<p>Wie man mit dem SQL-Server Text-Dateien einlesen kann, wusste ich schon l&#228;nger. Dazu musste man fr&#252;her OpenRowSet mit einem ODBC-Text-Treiber verwenden: <\/p>\n<p><code>SELECT  *<br \/>\nFROM OPENROWSET(&#x0027;MSDASQL&#x0027;,<br \/>\n        &#x0027;Driver={Microsoft Text Driver (*.txt; *.csv)};DEFAULTDIR=&#x0027;E:\\data;Extensions=txt;&#x0027;,<br \/>\n        &#x0027;SELECT * FROM [test.txt]&#x0027;) AS t;<\/code><br \/>\nAber das war tricky und der Output war immer pro Zeile ein Datensatz. Freilich konnte man auch die Daten mittels &quot;BULK INSERT&quot; in eine Tabelle laden, aber auch das war umst&#228;ndlich. Seit SQL-Server-2005 gibt es dazu eine gute und dokumentierte L&#246;sung:<\/p>\n<p><code>SELECT  x<br \/>\nFROM    OPENROWSET(BULK &#x0027;E:\\data\\test.txt&#x0027;, SINGLE_CLOB) AS t(x);<\/code><\/p>\n<p>Das funktioniert auch mit Bildern oder beliebigen anderen Dateien, dann ist es aber ein &quot;SINGLE_BLOB&quot;. Aber das Schreiben ist so immer noch nicht m&#246;glich. Freilich kann man auch hier wieder mit OpenRowSet arbeiten. Der Text-Treiber kann aber keinen INSERT, daher muss man dann schon den Treiber f&#252;r Access nehmen und so tun als w&#228;re es eine csv-Datei. Mit dem gelang es aber nicht eine neue Datei anzulegen. Man musste also zuerst eine leere Datei via xp_cmsshell anlegen und konnte sie dann f&#252;llen. Das geht aber nur mit 32-Bit-SQL-Servern, weil es gibt keine 64-Bit-Treiber f&#252;r die Jet-Engine gibt&#8230; \ud83d\ude41<\/p>\n<p>Bei Simple-Talk fand ich eine praktikable L&#246;sung dazu: Man verwendet &quot;bcp&quot; via &quot;xp_cmdshell&quot;, um die Daten in eine Text-Datei zu schreiben. Klingt schwierig, ist es aber nicht. Wie f&#252;r alle obigen L&#246;sungen ben&#246;tigt man auch hier Admin-Rechte. Die L&#246;sung taugt also nicht f&#252;r den laufenden Betrieb, aber eignet sich prima f&#252;r eigene administrative Aufgaben.<\/p>\n<p><code>DECLARE @Cmd nvarchar(2000);<br \/>\nSET  @Cmd = N&#x0027;bcp &quot;select t from [TestTable]&quot; queryout &quot;F:\\temp\\outfile.txt&quot; -T -S&#x0027;<br \/>\n\t\t\t+ @@servername + N&#x0027; -w&#x0027;; &#8211; &quot;-w&quot; f&#252;r Unicode-Datei &quot;-c&quot; f&#252;r ANSI<br \/>\nEXEC xp_cmdshell @Cmd;<\/code><\/p>\n<p>Nat&#252;rlich muss man die Verwendung von xp_cmdshell erst mal erlauben.<\/p>\n<p>Hier steht der Trick im Detail beschrieben und etliches mehr: &quot;<a href=\"http:\/\/www.simple-talk.com\/sql\/t-sql-programming\/the-tsql-of-text-files\/\">The TSQL of Text Files<\/a>&quot;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie man mit dem SQL-Server Text-Dateien einlesen kann, wusste ich schon l&#228;nger. Dazu musste man fr&#252;her OpenRowSet mit einem ODBC-Text-Treiber verwenden: SELECT * FROM OPENROWSET(&#x0027;MSDASQL&#x0027;, &#x0027;Driver={Microsoft Text Driver (*.txt; *.csv)};DEFAULTDIR=&#x0027;E:\\data;Extensions=txt;&#x0027;, &#x0027;SELECT * FROM [test.txt]&#x0027;) AS t; Aber das war tricky und der Output war immer pro Zeile ein Datensatz. Freilich konnte man auch die Daten [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[578,577],"_links":{"self":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/3432"}],"collection":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/comments?post=3432"}],"version-history":[{"count":7,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/3432\/revisions"}],"predecessor-version":[{"id":3470,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/posts\/3432\/revisions\/3470"}],"wp:attachment":[{"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/media?parent=3432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/categories?post=3432"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.glorf.it\/blog\/wp-json\/wp\/v2\/tags?post=3432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}