web-dev-qa-db-fra.com

"Impossible d'ouvrir le fichier de données de l'hôte BCP" en utilisant xp_cmdshell de SSMS mais la ligne de commande fonctionne

J'ai une procédure stockée qui s'exécute sur un travail de temps en temps pour BCP certains fichiers laissés par une application que j'ai écrite.

J'ai remarqué que les fichiers s'accumulaient et que BCP ne les récupérait pas, j'ai donc testé dans Management Studio en utilisant les éléments suivants:

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

Et j'ai ce message d'erreur

BCP Error

L'exécution à partir de la ligne de commande sur le même serveur à l'aide de la même commande ne pose aucun problème.

Voici quelques autres observations:

  1. Je peux courir EXEC master..xp_cmdshell 'dir C:\*.*' et les résultats reviennent comme prévu.
  2. Si je copie et renomme le fichier en quelque chose de différent, BCP le récupère
  3. Le fichier n'est pas laissé ouvert par mon application: je peux le déplacer, le renommer, le modifier et l'enregistrer, le supprimer etc ... sans aucune plainte de Windows.
  4. Le format interne du fichier est évidemment correct (voir 2.)
  5. NT SERVICE\MSSQLSERVER dispose des autorisations Contrôle total sur le répertoire.
  6. Les Maple Leafs ont échangé Dion Phaneuf hier

Toute aide est appréciée.

6
Brandon

Je viens de faire travailler votre code de mon côté.

Essaye ça:

Option A

  1. Attribuez des autorisations NTFS de contrôle total à 'C:\BCPFiles\bcpFile.dat à l'utilisateur que vous utiliserez dans SQL Server Management Studio pour exécuter la requête
  2. Réexécutez votre requête dans SQL Server Management Studio

Option B

Ou, juste pour dépasser l'erreur suivante, essayez:

Error = [Microsoft][ODBC Driver 11 for SQL Server]Unable to open BCP Host data-file
  1. Supprimer/déplacer votre fichier bcpfile.dat
  2. sur le type de ligne de commande (pour créer un fichier factice - oui, il y aura des erreurs d'importation, mais juste pour dépasser l'ouverture du fichier ...)

    écho.> c:\bcpfiles\bcpfile.dat

  3. Réexécutez votre requête dans SQL Server Management Studio

Si l'option A fonctionne, c'est un problème d'autorisations. Si l'option B fonctionne (en dépassant l'erreur d'origine), vous avez un fichier ouvert - même s'il ne semble pas être ouvert. Il existe des utilitaires qui aident à trouver ces fichiers ouverts, mais un moyen facile et bon marché de tester consiste simplement à redémarrer le serveur - espérons que c'est une boîte de développement/test.

8
Sting

Cela se produit car le nom de fichier est manquant.

C'est mauvais:

exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'

Vous ne pouvez pas écrire dans un dossier. Vous devez écrire dans un fichier.

C'est acceptable:

exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\others.txt"'

car vous avez spécifié un nom de fichier.

0
user133153

Erreur = [Microsoft] [Pilote ODBC 11 pour SQL Server] Impossible d'ouvrir le fichier de données de l'hôte BCP.

  • lié à cette erreur, il en raison du BCP ne peut pas ouvrir le répertoire de sortie. comme: exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'
  • changer le répertoire de sortie de D:..\ à C:..\, ça ira comme je le faisais auparavant.
0
Phearin Sok