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.
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éé.
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.