web-dev-qa-db-fra.com

Comment supprimer les traits d'union dans SQLCMD

Comment puis-je supprimer les tirets (------------) du jeu de 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>
25
atricapilla

La seule chose à laquelle je peux penser est de supprimer l'en-tête à l'aide du commutateur -h -1 et d'ajouter les noms de colonne en tant que première ligne de la requête SQL:

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

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

14
Stef Heyenrath

Je n'ai pas vu toutes ces informations à la fois et j'ai pensé que la prochaine personne à la recherche de cette information pourrait l'apprécier ... 

utilisez l'option -h -1 pour supprimer les tirets (--------) de la sortie et SET NOCOUNT ON pour supprimer les "lignes concernées". C'est très bien si vous créez un rapport ou 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 déclarations sélectionnées pour cela.

10
Justin Hanley

En utilisant uniquement 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 gérer les données contenant des délimiteurs (par exemple, "Atlanta, Géorgie"), vous devez spécifier les champs séparément (plutôt que d'utiliser "select *") et utiliser la fonction QUOTENAME dans SQL Server.

9
MichaelM

C'est tout!

Comment supprimer les traits d'union (------------) du jeu de résultats de cette commande sqlcmd:

Vous pouvez tout faire de manière simple dans 1 commande , sans manipulation de script ni de fichier !!

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

Ajoutez set nocount on; pour supprimer la ligne (X rows affected) . Ajoutez|findstr /v /c:"---"pour supprimer le soulignement . De cette façon, vous obtiendrez une réponse nette avec uniquement:

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

Ou peut-être post-traiter la sortie via sed comme:

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

supprimer la deuxième ligne?

Vous pouvez obtenir un fichier Win32 sed à partir de http://gnuwin32.sourceforge.net/packages/sed.htm

3
dsz

Pour supprimer les traits d'union, j'ajoute du code à mes procédures stockées qui générera uniquement l'en-tête de colonne. L'extraction de données à l'aide de SQLCMD se fait en 2 parties. 

J'appelle d'abord ma procédure stockée avec un ensemble spécial de paramètres. Dans mon cas, quand j'appelle le SP avec tous les NULL, cela signifie que je souhaite avoir l'en-tête de colonne. 

Ensuite, j'appelle SQLCMD une seconde fois et ajoute la sortie au fichier que je viens de créer avant et le tour est joué!

Créer un fichier CSV vierge pour contenir 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

Ajoutez maintenant le résultat 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 utilise> et la seconde >> . Lorsque vous utilisez un -> "Créer ou écraser" et deux -> "Ajouter ou créer".

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

si vous souhaitez spouler les données, vous pouvez définir le commutateur suivant: 

SET UNDERLINE OFF;

1
rob h

J'ai dû faire une tonne de recherches car aucune des réponses ici correspond à ce que je cherchais. Je vais donc résumer en espérant que cela aidera les autres.

Pour moi, le moyen le plus simple était d'utiliser sed. Bien que cela ait déjà été suggéré ici, il existait une syntaxe incorrecte pour exécuter simultanément sqlcmd et sed. Si vous utilisez Windows, comme ce fut le cas pour moi, allez sur http://gnuwin32.sourceforge.net/packages/sed.htm pour télécharger sed

Ma dernière commande ressemblait à 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 "Modification du contexte de la base de données en ..."
-&& 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 écrase la sortie de sed sur 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ée correctement. Il ne devrait pas y avoir de guillemets autour de 2d dans l'instruction sed, comme indiqué ci-dessus, et est présent dans la documentation, sinon vous obtiendrez une erreur.

J'espère que cela t'aides!

1
Kade Beem

MichaelM a une solution décente, mais comme le soulignait Slingshot ... findstr pourrait être trop agressif et supprimer les lignes de données contenant des traits d'union. Une autre approche serait d'appeler sqlcommand pour obtenir le jeu de données, puis d'utiliser set/p pour extraire la première ligne du fichier de sortie et l'affecter à une variable. Supprimez ensuite le fichier de sortie d'origine. Ensuite, renvoyez les en-têtes dans un nouveau fichier. Enfin, dirigez un autre sqlcmd sans en-tête vers 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

Aussi Top 0 est un bon choix pour créer un "fichier d'en-têtes uniquement", mais uniquement si vous utilisez une instruction select. Si vous appelez une procédure stockée, utilisez FMTONLY ON pour récupérer les en-têtes uniquement à partir du 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 FMTONLY ON ne peut pas être utilisé contre des SP utilisant des tables #temp. En effet, FMTONLY ON n'exécute pas le SP. Il ne saisit que les métadonnées. Mais si les noms de colonne proviennent de tables qui n'existent pas de pré-exécution, vous ne pouvez pas obtenir ces noms de colonne.

  • Troie
0
Troy Witthoeft

Si vous pouviez créer d'abord un fichier dans un fichier (en utilisant l'option -o), une autre option de post-traitement utilisant powershell fonctionnerait en lisant le contenu du fichier - tout en sautant la deuxième ligne - et en l'écrivant à lui-même.

(Get-Content "file.txt" | Where {$_.ReadCount -ne 2}) | Set-Content "file.txt"
0
JustinStolle
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
0
guest

supprimer les tirets des résultats:

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'testMail',
@recipients = '[email protected]',
@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----
0