如何在SQLCMD中抑制连字符

atr*_*lla 26 sql-server 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>
Run Code Online (Sandbox Code Playgroud)

Ste*_*ath 15

我唯一能想到的是使用-h -1开关删除标题并将列名添加为SQL查询的第一行:

SELECT 'FirstName' as FirstName, 'LastName' as LastName
UNION
SELECT top 5 FirstName, LastName FROM Person.Contact
Run Code Online (Sandbox Code Playgroud)

请注意,如果还有其他数据类型,则(var)char需要使用以下内容转换字段:CAST(MyColumnName AS varchar(32)) as MyColumnName


Jus*_*ley 12

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

使用该-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
Run Code Online (Sandbox Code Playgroud)

在您的SQL脚本中:

SET NOCOUNT ON -- removes (rows affected from the output)
select 'your_column_1, your_column_2'
select * from your_table
Run Code Online (Sandbox Code Playgroud)

您不需要在select语句之间使用联合.

  • 虽然这确实删除了破折号“---”,但它也删除了我的列名称 (3认同)
  • @davidski 注意,在上面的脚本中,您需要有一个额外的选择来实际执行列名称“select 'your_column_1, your_column_2' select * from your_table` (2认同)

小智 10

仅使用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
Run Code Online (Sandbox Code Playgroud)

要处理内部分隔符的数据(例如"Atlanta,GA"),您需要单独指定字段(而不是使用"select*")并在SQL Server中使用QUOTENAME函数.


dsz*_*dsz 5

或者可能通过 sed 对输出进行后处理:

sqlcmd ... | sed -e '2d'
Run Code Online (Sandbox Code Playgroud)

删除第二行?

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


Sha*_*lon 5

而已!

如何从此sqlcmd命令的结果集中禁止连字符(------------):

您可以在1个命令中以简单的方式完成所有操作而无需任何脚本或文件操作!

sqlcmd -d AdventureWorks -s ";" -Q "SET NOCOUNT ON; SELECT top 5 FirstName, LastName FROM Person.Contact" |findstr /v /c:"---"
Run Code Online (Sandbox Code Playgroud)

添加set nocount on;以删除(X rows affected)行。添加|findstr /v /c:"---"以删除下划线。这样,您仅需:

FirstName                                         ;LastName
Gustavo                                           ;Achong
Catherine                                         ;Abel
Kim                                               ;Abercrombie
Humberto                                          ;Acevedo
Pilar                                             ;Ackerman
Run Code Online (Sandbox Code Playgroud)

  • 而且,如果第一列返回的字段以“ ---”开头,那么您也将其丢弃。 (2认同)

mar*_*c_s -7

我认为没有任何选项可以实现这一目标 - 恐怕您将不得不忍受这些标头。

  • `-h-1` 删除 SQLCMD 生成的标头 `sqlcmd -S 服务器 -d 数据库 -U 用户名 -P 密码 -o "somefile.csv" -h-1 -Q "exec myStoredProcedure NULL, NULL" -W -w 2000 -s"," > sometextfile.csv` (18认同)