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>
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
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.
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.
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
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
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".
si vous souhaitez spouler les données, vous pouvez définir le commutateur suivant:
SET UNDERLINE OFF;
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!
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.
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"
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 = '[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----