Ich habe eine gespeicherte Prozedur, die ab und zu für einen Job ausgeführt wird, um einige Dateien, die von einer von mir geschriebenen Anwendung hinterlassen wurden, zu BCP zu machen.
Ich habe festgestellt, dass sich die Dateien häufen und BCP sie nicht aufnimmt. Deshalb habe ich in Management Studio Folgendes getestet:
DECLARE @sql VARCHAR(MAX)
DECLARE @path VARCHAR(512) = 'C:\BCPFiles\'
--Use BCP to copy files in character format from the target directly into the table.
SET @sql = 'bcp [MyDB].[dbo].[MyTable] in ' + @path + 'bcpFile.dat -c -T'
EXEC master..xp_cmdshell @sql
Und habe diese Fehlermeldung bekommen
Die Ausführung über die Befehlszeile auf demselben Server mit demselben Befehl funktioniert problemlos.
Hier sind einige andere Beobachtungen:
EXEC master..xp_cmdshell 'dir C:\*.*'
und die Ergebnisse kehren wie erwartet zurück.NT SERVICE\MSSQLSERVER
verfügt über Vollzugriffsberechtigungen für das Verzeichnis.Jede Hilfe wird geschätzt.
Ich habe gerade Ihren Code bekommen, um an meinem Ende zu arbeiten.
Versuche dies:
Option A
Option B
Oder versuchen Sie Folgendes, um den folgenden Fehler zu überwinden:
Error = [Microsoft][ODBC Driver 11 for SQL Server]Unable to open BCP Host data-file
in der Befehlszeile eingeben (um eine Dummy-Datei zu erstellen - ja, es werden Importfehler auftreten, aber nur um das Öffnen der Datei zu überwinden ...)
echo.> c:\bcpfiles\bcpfile.dat
Führen Sie Ihre Abfrage in SQL Server Management Studio erneut aus
Wenn Option A funktioniert, liegt ein Berechtigungsproblem vor. Wenn Option B funktioniert (um den ursprünglichen Fehler zu überwinden), haben Sie eine geöffnete Datei - auch wenn sie nicht geöffnet zu sein scheint. Es gibt Dienstprogramme, die beim Auffinden dieser geöffneten Dateien helfen, aber eine kostengünstige und einfache Möglichkeit zum Testen besteht darin, den Server neu zu starten - hoffentlich handelt es sich um eine Entwickler-/Testbox.
Dies geschieht, weil der Dateiname fehlt.
Das ist schlecht:
exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'
Sie können nicht in einen Ordner schreiben. Sie müssen in eine Datei schreiben.
Das ist in Ordnung:
exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\others.txt"'
weil Sie einen Dateinamen angegeben haben.
Fehler = [Microsoft] [ODBC-Treiber 11 für SQL Server] BCP-Host-Datendatei kann nicht geöffnet werden.
exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'
D:..\
bis C:..\
, es wird in Ordnung sein, wie ich es früher getroffen habe.