Vous trouverez ci-dessous un exemple de déclaration du PCA .. Je ne suis pas habitué à utiliser le PCA, votre aide et votre franchise sont donc grandement appréciées.
Je l'utilise également avec un fichier de format.
Si j'exécute à partir de l'invite CMD, cela fonctionne bien, mais SQL me donne l'erreur . L'instruction BCP est sur une seule ligne et l'agent SQL Server est exécuté en tant que système local . le même système.
J'ai couru exec master..xp_fixeddrives C, 45589 E, 423686
J'ai essayé la sortie sur 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 fichier 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 création dans cet article, la dernière colonne du fichier de format est coupée mais lit SQL_Latin1_General_CP1_CI_AS
pour chaque colonne autre que la date du document.
Tout d’abord, éliminez un problème xp_cmdshell en effectuant un simple 'dir c: *. *';
Consultez mon blog si vous utilisez BCP pour exporter des fichiers.
J'ai eu des problèmes sur mon système dans lesquels je ne pouvais pas trouver le chemin d'accès à BCP.EXE.
Soit changez la variable PATH du code hard it.
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 chemin d'accès en\110\pour SQL Server 2012 et le nom de la base de données en [AdventureWorks2012], j'ai reçu l'erreur suivante.
Une fois les modifications apportées, le code fonctionne correctement à partir de SSMS. Le service s'exécute sous NT AUTHORITY\Local Service. L'Agent SQL Server est désactivé. Le fichier de sortie a été créé .
Le chemin de sortie existe-t-il? BCP ne crée pas le dossier avant d'essayer de créer le fichier.
Essayez ceci avant votre appel BCP:
EXEC xp_cmdshell 'MKDIR "E:\Storage\Export\Data\"'
Vérifiez que le fichier peut être ouvert dans une autre application ou programme . Si c'est le cas, bcp.exe ne peut pas écraser le contenu du fichier existant.
Dans mon cas, j'ai résolu le problème de la manière suivante:
ma commande é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 nom de fichier avec le répertoire était trop long. comme "D:\project-abc\R&D\abc-608\FilesNeeded\FilesNeeded\DataFiles\abc.csv"
.
Je change dans un répertoire plus simple comme: "D:\abc.csv"
Problème résolu.
Je suppose donc que le problème est dû au dépassement du nom de fichier. ainsi le fichier n'a pas été trouvé.
Si cela fonctionne à partir de la ligne de commande mais pas à partir de l'agent SQL, je pense que c'est un problème d'authentification.
L'Agent SQL Server s'exécute sous un compte. Assurez-vous que le compte a la capacité de lire le fichier de format et de générer le fichier de sortie.
Assurez-vous également que le compte peut exécuter la procédure stockée xp_cmdshell.
Écris tes progrès ...
Si quelqu'un d'autre rencontre le même problème: j'avais ...lesPerson" queryout'
plutôt que ...lesPerson" queryout '
Dans mon cas, ce correctif fonctionnait simplement en mode administrateur.
Supprimez no_output de votre commande, si vous utilisez un cours
SET @sql = 'BCP ....'
EXEC master..xp_cmdshell @sql , no_output
EXEC master..xp_cmdshell @sql