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
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:
EXEC master..xp_cmdshell 'dir C:\*.*'
et les résultats reviennent comme prévu.NT SERVICE\MSSQLSERVER
dispose des autorisations Contrôle total sur le répertoire.Toute aide est appréciée.
Je viens de faire travailler votre code de mon côté.
Essaye ça:
Option A
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
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
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.
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.
Erreur = [Microsoft] [Pilote ODBC 11 pour SQL Server] Impossible d'ouvrir le fichier de données de l'hôte BCP.
exec master..xp_cmdshell 'bcp "select * from [TestDB].[dbo].[tbl]" queryout "C:\Test\"'
D:..\
à C:..\
, ça ira comme je le faisais auparavant.