この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>
考えられる唯一のことは、_-h -1
_スイッチを使用してヘッダーを削除し、列名を最初の行としてSQLクエリに追加することです。
_SELECT 'FirstName' as FirstName, 'LastName' as LastName
UNION
SELECT top 5 FirstName, LastName FROM Person.Contact
_
他のデータ型が_(var)char
_の場合、次を使用してフィールドを変換する必要があることに注意してください:CAST(MyColumnName AS varchar(32)) as MyColumnName
私はこの情報をすべて一度に見ることができなかったので、それを探している次の人がそれを評価するかもしれないと思いました...
使用 -h -1
オプションは、出力からダッシュ(--------)を削除し、SET NOCOUNT ON
「影響を受ける行」を削除します。これは、別のシステムが処理するレポートまたはCSVファイルを作成する場合に最適です。
例:
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
SQLスクリプトで:
SET NOCOUNT ON -- removes (rows affected from the output)
select 'your_column_1, your_column_2'
select * from your_table
このために、selectステートメント間で和集合を使用する必要はありません。
SqlcmdとWindowsコマンドラインのみを使用し、ストアドプロシージャは使用しません。
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
内部で区切り文字を使用してデータを処理するには( "Atlanta、GA"など)、フィールドを個別に指定し( "select *"を使用するのではなく)、SQL ServerでQUOTENAME関数を使用する必要があります。
それでおしまい!
このsqlcmdコマンドの結果セットからハイフン(------------)を抑制するにはどうすればよいですか。
1コマンド、スクリプトやファイル操作なしで)簡単にすべてを行うことができます!!
sqlcmd -d AdventureWorks -s ";" -Q "SET NOCOUNT ON; SELECT top 5 FirstName, LastName FROM Person.Contact" |findstr /v /c:"---"
追加 set nocount on;
を削除するには(X rows affected)
行。追加 - |findstr /v /c:"---"
下線を削除します。このようにして、あなたは明確な答えを得ます:
FirstName ;LastName
Gustavo ;Achong
Catherine ;Abel
Kim ;Abercrombie
Humberto ;Acevedo
Pilar ;Ackerman
または、sedを使用して出力を後処理することもできます。
sqlcmd ... | sed -e '2d'
2行目を削除するには?
Win32 sedは http://gnuwin32.sourceforge.net/packages/sed.htm から取得できます。
ハイフンを取り除くために、列ヘッダーのみを出力するコードをストアドプロシージャに追加します。 SQLCMD
を使用したデータの抽出は、2つの部分で行われます。
最初に、特別なパラメーターセットを使用してストアドプロシージャを呼び出します。私の場合、SPをすべてNULLで呼び出すと、列ヘッダーが必要になります。
次に、もう一度SQLCMD
を呼び出して、先ほど作成したファイルに出力を追加します。
列ヘッダーを保持する空のCSVファイルを作成します
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
ストアドプロシージャからの出力結果を追加します
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
通知最初のコマンドは>を使用し、2番目のコマンドは>>を使用します。 1つを使用する場合->「作成または上書き」および2つ->「追加または作成」。
データをスプールする場合は、次のスイッチを設定できます。
下線をオフに設定します。
ここでの答えはどれも私が探していたものと完全には一致しなかったので、私はたくさんの研究をしなければなりませんでした。だから私はそれが他の人を助けることを期待して要約するつもりです。
私にとって、最も簡単な方法はsed
を使用することでした。これはすでにここで提案されていますが、sqlcmdとsedを同時に実行するための誤った構文がありました。私と同じようにWindowsを使用している場合は、 http://gnuwin32.sourceforge.net/packages/sed.htm にアクセスしてsedをダウンロードします。
私の最後のコマンドは次のようなものでした:
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
は、「変更されたデータベースコンテキストを...」行を削除します
-&&
最初のコマンドが正常に実行された場合、2番目のコマンドを実行します
-sed -i 2d
は、ハイフンを含む2行目を削除し、sedの出力を元の出力に上書きします
sed
出力ファイル名とsqlcmd
からの出力は一致する必要があることに注意してください。一致しない場合、sqlcmd
からの出力は正しく上書きされません。上記のようにsed
ステートメントの2d
を引用符で囲まないでください。引用符で囲まれていないと、エラーが発生します。
お役に立てれば!
次のことができます。
exec 'sqlcmd -S YourServer -E -Q "set nocount on; select * from YourTable" -s "," -W | findstr /R /C:"^[^-]*$" > yourfile.csv'
これにより、ダッシュなしのヘッダーとトリミングされた空白を含むcsvファイルが1度に作成されます。上記のMichaelMの回答に基づく。
MichaelMにはまともな解決策がありますが、パチンコが指摘したように... findstrは非常に攻撃的であり、ハイフンを含むデータ行を削除できます。別の方法としては、sqlcommandを呼び出してデータセットを取得し、set/pを使用して出力ファイルから最初の行を取得し、それを変数に割り当てます。次に、元の出力ファイルを削除します。次に、ヘッダーを新しいファイルにエコーします。最後に、別のヘッダーなしのsqlcmdをそのファイルにパイプします。
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は「ヘッダーのみのファイル」を作成するための良い選択ですが、selectステートメントを使用している場合のみです。ストアドプロシージャを呼び出す場合は、FMTONLY ONを使用して、SPからのみヘッダーを取得してください。
sqlcmd -S server -d database -E -Q "Set NOCOUNT ON; Set FMTONLY ON; exec myStoredProcedure" -W -o my_headers.csv -m-1
#tempテーブルを使用しているSPに対してFMTONLY ONを使用できないことに注意してください。これは、FMTONLY ONがSPを実行しないためです。メタデータのみを取得します。ただし、列名が実行前に存在しないテーブルからのものである場合、それらの列名を取得することはできません。
最初にファイルに出力できる場合(-o
オプションを使用)、 powershell を使用する別の後処理オプション=は、2行目をスキップしながらファイルの内容を読み取り、それ自体に書き戻すことで機能します。
(Get-Content "file.txt" | Where {$_.ReadCount -ne 2}) | Set-Content "file.txt"
通常、結果の.csv
ファイルは次のように処理します。
sed -i '2d' "$file" # remove 2nd line of dashes
sed -i '$d' "$file" # remove last line (row count string)
sed -i '$d' "$file" # remove one more empty line at the end of the file
どこ:
-i
はファイルをその場で編集します...2d
は2行目を削除します。この場合は、ダッシュの行です...$d
は、ファイルの最後の1行を削除します..."$file"
は、.csv
ファイルへのパス文字列を保持するbash変数です。これは私が最終的に得たものであり、私にとってうまくいきます:
sqlcmd -S 12.34.56.789 -i "C:\Qry.sql" -s"," -W -w1000 | findstr /V /R /C:"^[-,]*$" > Reprt.csv
この時点で、findstrとregexはすべて説明する必要があると思います:
findstr /V /R /C:"^[-,]*$"
正規表現は「初めに^
、-または、[-,]
何度でも*
、行の終わりに達するまで$
。
/V
は、一致しないものをすべて表示することを意味します。
>
続くと、表示をファイルにリダイレクトします。
これもSQLファイルに追加しました。
SET NOCOUNT ON;
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
結果からダッシュを削除します。
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----