2016-07-03 1 views
0

J'ai une requête que je cours sur ma base de données SQL Server via SQLCMD. Pour obtenir de longs champs de texte sans limite de données, j'utilise le drapeau -y0.Comment obtenir les en-têtes et les données SQLCMD avec l'indicateur -y

Malheureusement, lorsque vous utilisez l'indicateur -y0, mes en-têtes de requête disparaissent et la requête renvoie uniquement les données. Je souhaite également recevoir les en-têtes de la requête.

Étant donné que la requête est select * from sales;, je pensais faire quelque chose comme ceci:

sqlcmd -Q "select top 0 * from (select * from sales) as _; select * from sales;" -y0 -S "127.0.0.1,1433" -o output_file.csv 

Afin d'exécuter une requête pour les en-têtes et une autre pour les données, mais le drapeau -y0 affecte la première requête comme

Je voudrais trouver une solution impliquant une seule exécution de sqlcmd. Des idées?

Répondre

0

La méthode typique pour ce que vous faites dans la première requête est de rendre la clause WHERE toujours fausse:

WHERE 1 = 0 

Mais je ne sais pas si cela aura une incidence sur -y0 du tout.

Si vous faites deux exécutions, vous pouvez faire quelque chose comme ceci:

sqlcmd -Q "select * from sales where 1 = 0;" -S "127.0.0.1,1433" -o output_file_hdr.csv 
sqlcmd -Q "select * from sales;" -y0 -S "127.0.0.1,1433" -o output_file_data.csv 
copy /A output_file_hdr.csv + output_file_data.csv output_file.csv 
del output_file_hdr.csv 
del output_file_data.csv 

Personnellement, cependant, je ne serais probablement utiliser Invoke-Sqlcmd de PowerShell si sqlcmd.exe se conduit mal:

Invoke-SqlCmd -Server '127.0.0.1' -Database $Database -MaxCharLength ([int32]::MaxValue) ` 
    -Query "select * from sales;" | ` 
    Export-Csv -NoTypeInformation -Path output_file.csv;