33

如何从该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>
4

19 回答 19

22

我没有在一次地方看到所有这些信息,并认为下一个寻找它的人可能会欣赏它......

使用该-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

为此,您不需要在您的选择语句之间使用联合。

于 2015-07-23T23:01:20.590 回答
16

我唯一能想到的是使用-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

于 2011-06-15T07:17:01.020 回答
11

仅使用 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 函数。

于 2013-07-16T17:33:37.277 回答
10

就是这样!

如何从该 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
于 2016-06-20T14:43:47.617 回答
5

或者也许通过 sed 对输出进行后处理:

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

删除第二行?

您可以从http://gnuwin32.sourceforge.net/packages/sed.htm获得 Win32 sed

于 2012-06-12T05:42:50.803 回答
3

您可以执行以下操作:

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

这将一举创建一个带有标题的 csv 文件,没有破折号和修剪的空白。基于上面 MichaelM 的回答。

于 2019-08-02T22:10:11.410 回答
2

为了摆脱连字符,我在存储过程中添加了一些代码,这些代码将只输出列标题。提取数据使用SQLCMD分两部分完成。

首先,我使用一组特殊的参数调用我的存储过程。就我而言,当我用所有 NULL 调用 SP 时,这意味着我希望拥有列标题。

然后我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

注意第一个命令使用>和第二个命令>>。当使用一个->“创建或覆盖”和两个->“附加或创建”时。

  • -h-1 删除 SQLCMD 生成的标头
  • -W 删除尾随空格
  • -w 设置最大行宽
  • -s 定义列分隔符
于 2012-01-30T14:52:16.320 回答
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消除“将数据库上下文更改为...”行
-&&如果第一个命令成功运行,则运行第二个命令
-sed -i 2d删除包含连字符的第二行并将 sed 的输出覆盖到原始输出

请注意,sed输出文件名和输出sqlcmd必须匹配,否则输出sqlcmd将不会被正确覆盖。2d上面回答的声明中不应有引号sed,并且存在于他们的文档中,否则您将收到错误消息。

希望这可以帮助!

于 2018-02-20T22:13:30.667 回答
1

如果您可以改用 PowerShell

工作示例:

Invoke-DbaQuery "SELECT * FROM [MyApp].[dbo].[ClientConfig] WHERE ClientID='Default'" -SqlInstance mysql.mydomain.com -ReadOnly `
  | Export-Csv -Path clientconfig-default.csv -Encoding utf8 -UseQuotes AsNeeded

注意-ReadOnly仅对集群有用,并且可能是噪音(早期优化)。但我是一名开发人员查询/区分生产数据库,因此过于谨慎,因此尽量减少 DBA 可能注意到的负载。

我有时使用https://docs.dbatools.io/#Copy-DbaDbTableData复制整个表 mssql-to-mssql。它很快,我认为使用 BCP.EXE 或 BulkInsert。

于 2021-09-03T15:55:49.993 回答
0

如果您可以先输出到文件(使用-o选项) ,则使用的另一个后处理选项将通过读取文件的内容(同时跳过第二行)并将其写回自身来工作。

(Get-Content "file.txt" | Where {$_.ReadCount -ne 2}) | Set-Content "file.txt"
于 2013-05-26T07:13:45.310 回答
0

MichaelM 有一个不错的解决方案,但正如 slingshot 指出的那样...... 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

Top 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

需要注意的是,FMTONLY ON 不能用于使用 #temp 表的 SP。这是因为 FMTONLY ON 不执行 SP。它只抓取元数据。但是,如果列名来自执行前不存在的表,那么您将无法获得这些列名。

  • 特洛伊
于 2014-06-20T14:46:50.760 回答
0
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
于 2015-01-30T15:49:01.710 回答
0

如果输出到文件,请在成功执行后尝试以下操作:

    findstr /v /c:"---" sqloutput.dat > finaloutput.dat

我使用“---”,因为我的所有列都超过 3 个字符,并且我的数据中从未包含该字符串,但您也可以使用“-;-”来进一步降低风险或使用任何基于您的数据的分隔符来代替“;”。

于 2015-06-10T00:57:26.060 回答
0

从结果中删除破折号:

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'testMail',
@recipients = 'krishan@gmail.com',
@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----
于 2019-01-08T11:21:02.590 回答
0

我通常.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删除文件末尾的单行...
  • "$file"是保存文件路径字符串的 bash 变量.csv
于 2020-01-08T16:30:02.253 回答
0

这就是我最终得到的并且对我来说效果很好:

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;
于 2020-03-02T18:32:14.360 回答
-1

以下行:

findstr /R /C:"^[^-]*$" MyTableColumns.csv > MyTableHeader.csv

非常危险,因为它会删除所有包含“-”的行。你最好看看 findstr /? 并使用类似的东西:

findstr /B /V /C:"-----" MyTableColumns.csv > MyTableHeader.csv
于 2013-12-10T17:53:52.460 回答
-1

如果您想将数据假脱机,则可以设置以下开关:

设置下划线关闭;

于 2016-10-14T14:27:04.333 回答
-6

我认为没有任何选择可以实现这一点 - 恐怕你必须忍受这些标题。

于 2010-03-02T10:07:09.950 回答