Impossible d'ouvrir le file de données de l'hôte BCP

Voici un exemple de la déclaration BCP. Je n'ai pas l'habitude d'utiliser BCP, donc votre aide et votre franchise sont grandement appréciées

Je l'utilise aussi avec un file de format.

Si j'exécute à partir de l'invite CMD cela fonctionne bien mais à partir de SQL je reçois l'erreur. L'instruction BCP est sur une ligne et l'Agent SQL Server s'exécute en tant que système local. Le server SQL et le script sont sur le même système.

J'ai couru exec master..xp_fixindex C, 45589 E, 423686

J'ai essayé la sortie à C et E avec le même résultat

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 

Voici le file de format 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 

En raison de la mise en forme dans ce post, la dernière colonne du file de format est coupée mais lit SQL_Latin1_General_CP1_CI_AS pour chaque colonne autre que documentdate.

    Tout d'abord, exclure un problème xp_cmdshell en faisant un simple 'dir c: *. *';

    Consultez mon blog sur l'utilisation de BCP pour exporter des files.

    J'ai eu des problèmes sur mon système dans lequel je ne pouvais pas find le path d'access à BCP.EXE.

    Changez la variable PATH du code dur.

    L'exemple ci-dessous fonctionne avec 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 

    Avant de modifier le path vers \ 110 \ pour SQL Server 2012 et le nom de la database vers [AdventureWorks2012], j'ai reçu l'erreur suivante.

    entrez la description de l'image ici

    Après avoir apporté les modifications, le code fonctionne correctement à partir de SSMS. Le service fonctionne sous NT AUTHORITY \ Local Service. L'Agent SQL Server est désactivé. Le file de sortie a été créé.

    entrez la description de l'image ici

    Le path de sortie existe-t-il? BCP ne crée pas le dossier avant d'essayer de créer le file.

    Essayez ceci avant votre appel BCP:

     EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"' 

    Veuillez vérifier, le file peut être ouvert dans une autre application ou programme. Si c'est le cas, bcp.exe ne peut pas écraser le contenu du file existant.

    Dans mon cas, j'ai résolu le problème de la façon suivante:

    ma command était:

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

    Mon FileNameWithDirectory était trop long. comme "D:\project-abc\R&D\abc-608\FilesNeeded\FilesNeeded\DataFiles\abc.csv" .

    Je change dans un directory plus simple comme: "D:\abc.csv"

    Problème résolu.

    Donc je suppose que le problème est survenu à cause du dépassement du nom de file. ainsi le file n'a pas été trouvé.

    Si cela fonctionne à partir de la command line mais pas de l'Agent SQL, je pense que c'est un problème d'authentification.

    L'Agent SQL Server s'exécute sous un count. Assurez-vous que le count a la capacité de lire le file de format et de générer le file de sortie.

    Assurez-vous également que le count a la capacité d'exécuter la procédure stockée xp_cmdshell.

    Ecrivez avec vos progrès …

    Enlevez no_output de votre command, si vous utilisez un offcourse

     SET @sql = 'BCP ....' EXEC master..xp_cmdshell @sql , no_output EXEC master..xp_cmdshell @sql 

    Dans mon cas, cette correction fonctionnait simplement en mode administrateur.