it-swarm.com.de

BCP Host-Datendatei kann nicht geöffnet werden

Nachfolgend finden Sie ein Beispiel für die BCP-Erklärung. Ich bin nicht daran gewöhnt, BCP zu verwenden, daher wird Ihre Hilfe und Offenheit sehr geschätzt

Ich benutze es auch mit einer Formatdatei.

Wenn ich von CMD Prompt aus ausführte, funktioniert es einwandfrei, aber von SQL bekomme ich die Fehlermeldung ..__ Die BCP-Anweisung ist in einer Zeile und der SQL Server-Agent läuft als Lokales System . Der SQL-Server und das Skript sind aktiviert das gleiche System.

Ich habe exec master..xp_fixeddrives C, 45589 E, 423686 ausgeführt

Ich habe die Ausgabe in C und E mit dem gleichen Ergebnis versucht

EXEC xp_cmdshell 'bcp "Select FILENAME, POLICYNUMBER, INSURED_DRAWER_100, POLICY_INFORMATION, DOCUMENTTYPE, DOCUMENTDATE, POLICYYEAR FROM data.dbo.max" queryout "E:\Storage\Export\Data\max.idx" -fmax-c.fmt -SSERVERNAME -T

Hier ist die Formatdatei rmax-c.fmt

10.0

7

1      SQLCHAR             0       255     "$#Y#$"          1     FILENAME                               
2      SQLCHAR             0       40      ""               2     POLICYNUMBER                                 
3      SQLCHAR             0       40      ""               3     INSURED_DRAWER_100                           
4      SQLCHAR             0       40      ""               4     POLICY_INFORMATION                           
5      SQLCHAR             0       40      ""               5     DOCUMENTTYPE                                 
6      SQLCHAR             0       40      ""               6     DOCUMENTDATE                                 
7      SQLCHAR             0       8       "\r\n"           7     POLICYYEAR    

Aufgrund der Formatierung in diesem Beitrag wird die letzte Spalte der Formatdatei abgeschnitten, es wird jedoch SQL_Latin1_General_CP1_CI_AS für jede Spalte außer diesem documentdate gelesen. 

14
user2747607

Schließen Sie zunächst ein Problem mit xp_cmdshell aus, indem Sie ein einfaches 'dir c: *. *' Ausführen.

Check out mein Blog on Verwendung von BCP zum Exportieren von Dateien.

Ich hatte Probleme auf meinem System, bei denen ich den Pfad zu BCP.EXE nicht finden konnte. 

Ändern Sie entweder die PATH-Variable des Hardcodes.

Das folgende Beispiel funktioniert mit Adventure Works.

-- BCP - Export query, pipe delimited format, trusted security, character format
DECLARE @bcp_cmd4 VARCHAR(1000);
DECLARE @exe_path4 VARCHAR(200) = 
    ' cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ & ';
SET @bcp_cmd4 =  @exe_path4 + 
    ' BCP.EXE "SELECT FirstName, LastName FROM AdventureWorks2008R2.Sales.vSalesPerson" queryout ' +
    ' "C:\TEST\PEOPLE.TXT" -T -c -q -t0x7c -r\n';
PRINT @bcp_cmd4;
EXEC master..xp_cmdshell @bcp_cmd4;
GO

Vor dem Ändern des Pfads in\110\für SQL Server 2012 und des Namens der Datenbank in [AdventureWorks2012] wurde der folgende Fehler angezeigt.


enter image description here

Nachdem Sie die Änderungen vorgenommen haben, funktioniert der Code in SSMS einwandfrei. Der Dienst wird unter NT AUTHORITY\Local Service ausgeführt. Der SQL Server-Agent ist deaktiviert. Die Ausgabedatei wurde erstellt .

enter image description here

5
CRAFTY DBA

Ist der Ausgabepfad vorhanden? BCP erstellt den Ordner nicht, bevor versucht wird, die Datei zu erstellen.

Probieren Sie dies vor Ihrem BCP-Aufruf aus:

EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'
13
Daniel Molnar

Bitte überprüfen Sie, ob die Datei möglicherweise in einer anderen Anwendung oder einem anderen Programm geöffnet wird .. Wenn dies der Fall ist, kann bcp.exe den vorhandenen Dateiinhalt nicht überschreiben.

5
Rajesh

In meinem Fall habe ich das Problem auf folgende Weise gelöst: 

mein Befehl war: 

bcp "select Top 1000 * from abc.dbo.abcd" queryout FileNameWithDirectory -c -t "|" -r "0x0a" -S 192.111.1.111 -U xx -P xxxxx

Mein FileNameWithDirectory war zu lang. wie "D:\project-abc\R&D\abc-608\FilesNeeded\FilesNeeded\DataFiles\abc.csv"

Ich wechsle in ein einfacheres Verzeichnis wie: "D:\abc.csv"

Problem gelöst.

Ich denke, das Problem trat auf, weil der Dateiname überschritten wurde. daher wurde die Datei nicht gefunden. 

4

Wenn es von der Befehlszeile aus, aber nicht vom SQL-Agenten aus funktioniert, denke ich, dass es sich um ein Authentifizierungsproblem handelt.

Der SQL Server-Agent wird unter einem Konto ausgeführt. Stellen Sie sicher, dass das Konto die Formatdatei lesen und die Ausgabedatei generieren kann.

Stellen Sie außerdem sicher, dass das Konto die gespeicherte Prozedur xp_cmdshell ausführen kann.

Schreibe zurück mit deinem Fortschritt ...

2
CRAFTY DBA

Falls jemand anderes auf dasselbe Problem stößt: Ich hatte ...lesPerson" queryout' statt ...lesPerson" queryout ' 

0

In meinem Fall wurde dieses Update einfach im Administratormodus ausgeführt.

0
Arthur Swails

Entfernen Sie no_output von Ihrem Befehl, wenn Sie einen offcourse verwenden

SET @sql = 'BCP ....'

EXEC master..xp_cmdshell @sql , no_output

EXEC master..xp_cmdshell @sql
0
Stefan Michev

Ich erhielt dies, nachdem ich meinen Ausgabeordner freigegeben hatte, auch wenn keine Dateien geöffnet waren.

Ich habe einen neuen, nicht freigegebenen Ordner für die Ausgabe erstellt und alles war in Ordnung. (könnte jemandem helfen ;-))

0
Catherine

Wenn Ihr Code die Datendatei schreibt und sie dann mit BCP liest, stellen Sie sicher, dass Sie CLOSE THE DATA FILE, bevor Sie versuchen, sie zu lesen!

Andernfalls wird angezeigt: 'Host-Datendatei kann nicht geöffnet werden'.

Python-Beispiel:

# Management of temporary bulk insert file.

def openBulkInsertFile(self) :
    self.bulkInsertFile = open('c:/tmp/bulkInsertContent.txt', 'w', newline='')
    self.csvWriter = csv.writer(self.bulkInsertFile)

def closeBulkInsertFile(self) :
    self.bulkInsertFile.close()
0
CodeCabbie