Question

Comment puis-je supprimer des traits d'union (------------) de l'ensemble des résultats de cette commande sqlcmd:

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>
Était-ce utile?

La solution

Je ne pense pas qu'il y ait une option disponible pour ce faire - vous devrez vivre avec les en-têtes, je crains

.

Autres conseils

La seule chose que je peux penser est enlever l'en-tête en utilisant l'interrupteur -h -1 et en ajoutant les noms de colonnes comme la première ligne à la requête SQL:

SELECT 'FirstName' as FirstName, 'LastName' as LastName
UNION
SELECT top 5 FirstName, LastName FROM Person.Contact

Notez que s'il y a d'autres types de données puis (var)char, vous devez convertir le champ en utilisant: CAST(MyColumnName AS varchar(32)) as MyColumnName

Je ne vois pas toutes ces informations une fois lieu et je pensais que la prochaine personne à sa recherche pourrait l'apprécier ...

utilisez l'option -h -1 pour supprimer les tirets (--------) de la sortie et SET NOCOUNT ON pour éliminer les « lignes affectées ». Ce qui est excellent si vous créez un rapport ou d'un fichier CSV pour un autre système à traiter.

Exemple:

SQLCMD -S 127.0.0.1\SQL_SERVER_Instance -d db_name -U db_login -P password -i your_script.sql -o your_output.csv -h -1

Dans votre script SQL:

SET NOCOUNT ON -- removes (rows affected from the output)
select 'your_column_1, your_column_2'
select * from your_table

Vous n'avez pas besoin d'utiliser une union entre vos instructions select pour cela.

En utilisant seulement sqlcmd et la ligne de commande Windows, sans procédures stockées:

REM Get the column headers ("set nocount on" is necessary to suppress the rows affected message)
sqlcmd -S MyServer -Q "set nocount on;select top 0 * from MyDatabase.MySchema.MyTable" -o "MyTableColumns.csv" -s "," -W

REM Remove hyphen line
findstr /R /C:"^[^-]*$" MyTableColumns.csv > MyTableHeader.csv

REM Get data without headers
sqlcmd -S MyServer -Q "set nocount on;select * from MyDatabase.MySchema.MyTable" -o "MyTableData.csv" -h -1 -s "," -W
REM You can also use bcp for this step
REM bcp "select * from MyDatabase.MySchema.MyTable" queryout  "MyTableData.csv"  -c -t"," -r"\n" -S MyServer -T

REM Append header and data
type MyTableHeader.csv MyTableData.csv > MyTableDataWithHeader.csv

Pour traiter les données avec délimiteurs à l'intérieur (par exemple « Atlanta, GA »), vous devez spécifier les champs séparément (plutôt que d'utiliser « select * ») et utiliser la fonction QUOTENAME dans SQL Server.

Ca y est!

  

Comment puis-je supprimer des traits d'union (------------) de l'ensemble des résultats de cette commande sqlcmd:

Vous pouvez faire tout cela d'une manière simple 1 commande , sans script ou la manipulation de fichiers !!

sqlcmd -d AdventureWorks -s ";" -Q "SET NOCOUNT ON; SELECT top 5 FirstName, LastName FROM Person.Contact" |findstr /v /c:"---"

Ajouter set nocount on; pour supprimer la ligne de (X rows affected). Ajouter |findstr /v /c:"---" pour supprimer les soulignements. De cette façon, vous obtenez une réponse propre, avec seulement:

FirstName                                         ;LastName
Gustavo                                           ;Achong
Catherine                                         ;Abel
Kim                                               ;Abercrombie
Humberto                                          ;Acevedo
Pilar                                             ;Ackerman

Ou peut-être post-traitement par la sortie Sed:

sqlcmd ... | sed -e '2d'

pour supprimer la deuxième ligne?

Vous pouvez obtenir une sed de Win32 http://gnuwin32.sourceforge.net/packages/sed .htm

Pour se débarrasser des traits d'union, j'ajouter un code à mes procédures stockées qui affichera l'en-tête de la colonne seulement. données à l'aide SQLCMD est l'extraction fait en 2 parties.

D'abord, j'appelle ma procédure stockée avec un ensemble particulier de paramètres. Dans mon cas, quand je l'appelle la SP avec tous NULLs, cela signifie que je souhaite avoir l'en-tête de colonne.

Alors j'appelle SQLCMD une deuxième fois et concaténer la sortie vers le fichier que je viens de créer avant et le tour est joué!

Créez un fichier CSV vide pour maintenir l'en-tête de colonne

sqlcmd -S server -d database -U username -P password -o "somefile.csv" -h-1 
  -Q "exec myStoredProcedure NULL, NULL" -W -w 2000 -s"," > sometextfile.csv

Maintenant ajoutez le résultat de sortie de la procédure stockée

sqlcmd -S server -d database -U username -P password -o "somefile.csv" -h-1 
  -Q "exec myStoredProcedure 2011, 10" -W -w 2000 -s"," >> sometextfile.csv

Remarque La première commande utilisations > et le second >> . Lorsque vous utilisez un -> « Créer ou écraser » et deux -.> « Append ou créer »

  • -h-1 supprime l'en-tête générée par SQLCMD
  • -W supprime les espaces de fin
  • -w définir la largeur de ligne max
  • -s définit séparateur de colonnes

Je devais faire une tonne de recherche, car aucune des réponses ici correspondent exactement ce que je cherchais. Donc, je vais résumer dans l'espoir que cela aidera les autres.

Pour moi, la meilleure façon était d'utiliser sed. Bien que cela a déjà été suggéré ici, il y avait une syntaxe incorrecte de s'exécuter sqlcmd et sed simultanément. Si vous utilisez Windows, comme cela a été le cas pour moi, à la tête http: // GnuWin32. sourceforge.net/packages/sed.htm à télécharger sed

Ma dernière commande a regardé quelque chose comme:

SQLCMD -m 1 -S "userpc\SQLEXPRESS" -E -i "C:\someDirectory\sqlfile.sql" -W -s "," -o "C:\someDirectory\output.csv" && sed -i 2d "C:\someDirectory\output.csv"

--m 1 élimine la ligne « nouveau contexte de base de données ... »
-&& exécute la seconde commande si la première commande est exécutée avec succès
-sed -i 2d supprime la deuxième ligne contenant les traits d'union et écrase la sortie de sed à la sortie d'origine

Sachez que le nom du fichier de sortie sed et la sortie de sqlcmd doivent correspondre sinon la sortie de sqlcmd ne sera pas écrasé correctement. Il ne devrait pas être entre guillemets 2d dans la déclaration de sed comme réponses ci-dessus et est présente dans la documentation ou vous obtiendrez une erreur.

Hope this helps!

Si vous pouviez sortie vers un fichier premier (en utilisant l'option -o) , une autre option post-traitement en utilisant powershell travaillerait en lisant le contenu du fichier - tout en sautant la deuxième ligne -. et l'écrire à lui-même

(Get-Content "file.txt" | Where {$_.ReadCount -ne 2}) | Set-Content "file.txt"

MichaelM a une solution décente, mais comme lance-pierre a souligné ... findstr pourrait être plus agressif et supprimer les lignes de données qui contiennent des traits d'union. Une autre approche serait d'appeler sqlcommand pour obtenir l'ensemble de données, puis en utilisant set / p pour saisir la première ligne à partir du fichier de sortie et l'assigner à une variable. Ensuite, supprimez le fichier de sortie Orignal. Ensuite, l'écho sur les en-têtes dans un nouveau fichier. Enfin, un autre tuyau entete sqlcmd à ce fichier.

sqlcmd -S server -d database -E -Q "exec myStoredProcedure" -W -o my_headers.csv -m-1
set /p headers=< my_headers.csv
del my_headers.csv
echo %headers% > my_data.csv
sqlcmd -S server -d database -E -Q "exec myStoredProcedure" -W -m-1 -h-1 >> my_data.csv

0 également Top est bon choix pour créer un « fichier des en-têtes seulement », mais seulement si vous utilisez une instruction select. Si vous appelez une procédure stockée, regarder dans FMTONLY ON pour récupérer les en-têtes seulement 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 étant que le FMTONLY ON ne peut pas être utilisé contre l'utilisation des tables #temp de SP. En effet, FMTONLY ON n'exécute pas la SP. Il saisit uniquement les métadonnées. Mais si les noms de colonnes proviennent de tableaux qui n'existent pas avant l'exécution, alors vous ne pouvez pas obtenir ces noms de colonnes.

  • Troy
Public Sub HyphenDelete(strFilename1 As String, Hyphens As Integer)


Const FOR_READING = 1
Const FOR_WRITING = 2

strFileName = strFilename1

strCheckForString = Left("-------", Hyphens)
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objTS = objFS.OpenTextFile(strFileName, FOR_READING)
strContents = objTS.ReadAll
objTS.Close

arrLines = Split(strContents, vbNewLine)
Set objTS = objFS.OpenTextFile(strFileName, FOR_WRITING)

For Each strLine In arrLines
   If Not (Left(UCase(LTrim(strLine)), Len(strCheckForString)) = strCheckForString) Then
      objTS.WriteLine strLine
   End If
Next

End Sub

supprimer les tirets des résultats:

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'testMail',
@recipients = 'krishan@gmail.com',
@query = '  
SET NOCOUNT ON
SELECT W.* FROM (
(SELECT CAST("id" AS VARCHAR(5) ) as id , CAST("name" AS VARCHAR(50) )as name ) 
UNION ALL 

SELECT CAST( id AS VARCHAR(5) ) AS id, CAST (name AS VARCHAR(50) ) AS name from mydb.dbo.bank
 )W
' ,
@subject = 'Test email',
@attach_query_result_as_file = 1,
@query_attachment_filename='filename.xls',
@query_result_separator='   ',   
@query_result_header = 0

    -----remember @query..separator should be--Tab space----

Vous pouvez faire ce qui suit:

exec 'sqlcmd -S YourServer -E -Q "set nocount on; select * from YourTable" -s "," -W | findstr /R /C:"^[^-]*$" > yourfile.csv'

Cela va créer un fichier csv avec les en-têtes, sans les tirets et l'espace blanc garni, d'un seul coup. Sur la base de la réponse de MichaelM ci-dessus.

La ligne suivante:

findstr /R /C:"^[^-]*$" MyTableColumns.csv > MyTableHeader.csv

est très dangereux car il supprime toutes les lignes contenant un « - ». Vous feriez mieux de jeter un oeil à findstr /? et utiliser quelque chose comme:

findstr /B /V /C:"-----" MyTableColumns.csv > MyTableHeader.csv

Si la sortie vers un fichier essayez ce qui suit lors de l'exécution réussie:

    findstr /v /c:"---" sqloutput.dat > finaloutput.dat

utiliser « --- » comme toutes mes colonnes sont plus de 3 caractères et je n'ai jamais cette chaîne dans mes données, mais vous pouvez aussi utiliser « -; - » pour réduire le risque ou tout delimiter en fonction de vos données la place de la ";".

si vous voulez spool les données, alors vous pouvez régler le commutateur suivant:

SET SOULIGNENT OFF;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top