web-dev-qa-db-ja.com

SQLCMDでハイフンを抑制する方法

この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>
29
atricapilla

考えられる唯一のことは、_-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

14
Stef Heyenrath

私はこの情報をすべて一度に見ることができなかったので、それを探している次の人がそれを評価するかもしれないと思いました...

使用 -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ステートメント間で和集合を使用する必要はありません。

11
Justin Hanley

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関数を使用する必要があります。

10
MichaelM

それでおしまい!

この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
4
Shai Alon

または、sedを使用して出力を後処理することもできます。

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

2行目を削除するには?

Win32 sedは http://gnuwin32.sourceforge.net/packages/sed.htm から取得できます。

3
dsz

ハイフンを取り除くために、列ヘッダーのみを出力するコードをストアドプロシージャに追加します。 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つ->「追加または作成」。

  • -h-1は、SQLCMDによって生成されたヘッダーを削除します
  • -Wは末尾のスペースを削除します
  • -w最大行幅を設定します
  • -sは列セパレーターを定義します
2
DanielM

データをスプールする場合は、次のスイッチを設定できます。

下線をオフに設定します。

1
rob h

ここでの答えはどれも私が探していたものと完全には一致しなかったので、私はたくさんの研究をしなければなりませんでした。だから私はそれが他の人を助けることを期待して要約するつもりです。

私にとって、最も簡単な方法は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を引用符で囲まないでください。引用符で囲まれていないと、エラーが発生します。

お役に立てれば!

1
Kade Beem

次のことができます。

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

これにより、ダッシュなしのヘッダーとトリミングされた空白を含むcsvファイルが1度に作成されます。上記のMichaelMの回答に基づく。

1
Paschover

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を実行しないためです。メタデータのみを取得します。ただし、列名が実行前に存在しないテーブルからのものである場合、それらの列名を取得することはできません。

  • トロイ
0
Troy Witthoeft

最初にファイルに出力できる場合-oオプションを使用)powershell を使用する別の後処理オプション=は、2行目をスキップしながらファイルの内容を読み取り、それ自体に書き戻すことで機能します。

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

通常、結果の.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変数です。
0
Fitzwallace

これは私が最終的に得たものであり、私にとってうまくいきます:

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;
0
flashsplat
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

結果からダッシュを削除します。

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----