Comment faire pour supprimer des traits d'union dans SQLCMD
Comment puis-je supprimer des traits d'union (------------) à partir de l'ensemble des résultats de cette sqlcmd
commande:
C:\temp>sqlcmd -d AdventureWorks -s ";"
-Q "SET NOCOUNT ON SELECT top 5 FirstName, LastName FROM Person.Contact;"
FirstName ;LastName
--------------------------------------------------;----------------------------
Gustavo ;Achong
Catherine ;Abel
Kim ;Abercrombie
Humberto ;Acevedo
Pilar ;Ackerman
C:\temp>
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'il soit disponible en option pour atteindre ce - que vous aurez à vivre avec ces en-têtes, j'en ai peur.
-h-1
supprime l'en-tête généré par l'utilitaire SQLCMDsqlcmd -S server -d database -U username -P password -o "somefile.csv" -h-1 -Q "exec myStoredProcedure NULL, NULL" -W -w 2000 -s"," > sometextfile.csv
La seule chose que je peux penser à est en retrait de la tête à l'aide de la
-h -1
interrupteur et en ajoutant les noms de colonne dans la première ligne de la Requête SQL:Noter que si il y a d'autres types de données, puis
(var)char
, vous avez besoin de convertir le champ à l'aide d' :CAST(MyColumnName AS varchar(32)) as MyColumnName
-h -1
et répond à la question.Je n'ai pas vu toutes ces informations en un seul endroit et de la pensée de la prochaine personne à la recherche d', il pourrait l'apprécier...
utiliser le
-h -1
option pour supprimer les tirets (--------) à partir de la sortie etSET NOCOUNT ON
de retirer les "lignes affectées". C'est génial si vous êtes à la création d'un rapport ou d'un fichier CSV pour un autre système de processus.Exemple:
Dans votre script SQL:
Vous n'avez pas besoin d'utiliser une union entre vos instructions select pour cela.
select 'your_column_1, your_column_2' select * from your_table
En utilisant uniquement sqlcmd et de la ligne de commande de Windows, sans procédures stockées:
Pour gérer des données avec des séparateurs à l'intérieur (par exemple "Atlanta, GA") vous aurez besoin de spécifier les champs séparément (plutôt que d'utiliser "select *") et utilisez la fonction QUOTENAME dans SQL Server.
Que c'est!
Vous pouvez le faire d'une façon simple, 1 commande, sans script ou un fichier de manipulation!!
Ajouter
set nocount on;
pour supprimer le(X rows affected)
ligne.Ajouter
|findstr /v /c:"---"
pour supprimer le soulignement.De cette façon, vous obtenez un propre réponse, avec seulement:
Ou peut-être post-traitement à la sortie à travers sed comme:
à supprimer la deuxième ligne?
Vous pouvez obtenir un Win32 sed de http://gnuwin32.sourceforge.net/packages/sed.htm
Pour se débarrasser des traits d'union, j'ai ajouter un peu de code pour mes procédures stockées qui va de la sortie de la colonne d'en-tête uniquement. L'extraction de données à l'aide de
SQLCMD
est fait en 2 parties.D'abord j'appelle ma procédure stockée avec un ensemble de paramètres. Dans mon cas, lorsque j'appelle le PS, avec toutes les valeurs Null, cela signifie que je désire avoir l'en-tête de colonne.
Puis-je appeler
SQLCMD
une seconde fois, puis ajouter la sortie vers le fichier que je viens de créer avant et le tour est joué!Créer un fichier CSV vide pour contenir l'en-tête de colonne
Maintenant ajouter le résultat de sortie de la procédure stockée
Avis la première commande utilise > et le second >>. Lors de l'utilisation de celui -> "Créer ou de remplacer" et deux -> "Ajouter" ou "créer".
J'ai eu à faire une tonne de recherche, car aucune des réponses ici adapte exactement ce que je cherchais. Je vais donc à la somme, dans l'espoir qu'il aidera d'autres.
Pour moi, la façon la plus simple était d'utiliser
sed
. Tout cela a déjà été suggéré ici, il y avait une syntaxe incorrecte pour exécuter l'utilitaire sqlcmd et sed en même temps. Si vous utilisez Windows, comme ce fut le cas pour moi, de la tête aux http://gnuwin32.sourceforge.net/packages/sed.htm pour télécharger sedMa dernière commande cherché quelque chose comme:
Où
-
-m 1
élimine le "Changé contexte de base de données..."-
&&
exécute la deuxième commande si la première commande s'exécute correctement-
sed -i 2d
supprime la deuxième ligne contenant les traits d'union et l'écrase à la sortie de la sed à la sortie d'origineÊtre conscient que la
sed
nom du fichier de sortie et la sortie desqlcmd
doit correspondre sinon la sortie desqlcmd
ne sera pas correctement remplacée. Il ne devrait pas être entre guillemets2d
dans lesed
déclaration répondu ci-dessus et est présent dans leur documentation ou vous obtiendrez une erreur.Espérons que cette aide!
Si vous pouviez sortie vers un fichier (à l'aide de la
-o
option), l'autre post-traitement à l'option à l'aide de powershell va lire le contenu du fichier--tout en sautant, en deuxième ligne, et de l'écrire à lui-même.-h -1
dans le sqlcmd?-h -1
option supprime l'en-tête complètement. La question était de savoir comment supprimer le trait d'union qui apparaissent à la suite de la ligne d'en-tête de noms.MichaelM a une solution décente, mais comme slingshot souligné ... findstr pourrait être plus agressif et de suppression des données les lignes qui contiennent des traits d'union. Une autre approche serait d'appeler sqlcommand pour obtenir l'ensemble de données, puis à l'aide de set /p pour afficher la première ligne du fichier de sortie et l'affecter à une variable. Supprimez l'original du fichier de sortie. Prochaine écho, les en-têtes dans un nouveau fichier. Enfin, la pipe de l'autre sans en-tête sqlcmd pour ce fichier.
Aussi Top 0 est le bon choix pour créer un "en-têtes de fichier", mais seulement si vous utilisez une instruction select. Si vous êtes à l'appel d'une procédure stockée, regarder dans l'aide de FMTONLY à saisir les en-têtes uniquement à partir de la SP.
sqlcmd -S server -d database -E -Q "Set NOCOUNT ON; Set FMTONLY ON; exec myStoredProcedure" -W -o my_headers.csv -m-1
Une mise en garde que le FMTONLY SUR ne peuvent pas être utilisés contre la SP à l'aide de #tables temporaires. C'est parce que FMTONLY ne pas exécuter de la SP. Il ne récupère que les métadonnées. Mais si les noms de colonne sont à venir à partir de tables qui n'existent pas avant l'exécution, vous ne pouvez pas obtenir ces noms de colonne.
supprimer les tirets de résultats:
La ligne suivante:
est très dangereux car il supprime toutes les lignes contenant un "-".
Il vaut mieux avoir un coup d'oeil à findstr /? et d'utiliser quelque chose comme:
Si la sortie à un fichier, essayez les opérations suivantes lors de l'exécution réussie:
- Je utiliser "---" comme tous mes colonnes sont plus de 3 caractères et je n'ai pas la chaîne dans mes données, mais vous pouvez également utiliser "-;-" pour réduire le risque de plus ou un délimiteur basée sur vos données en lieu et place des ";".
si vous voulez traiter les données, vous pouvez configurer le commutateur suivant:
JEU DE SOULIGNER OFF;