Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLCMD中抑制连字符_Sql Server_Sqlcmd_Powershell - Fatal编程技术网

Sql server 如何在SQLCMD中抑制连字符

Sql server 如何在SQLCMD中抑制连字符,sql-server,sqlcmd,powershell,Sql Server,Sqlcmd,Powershell,如何从该sqlcmd命令的结果集中抑制连字符(-------------): C:\temp>sqlcmd -d AdventureWorks -s ";" -Q "SET NOCOUNT ON SELECT top 5 FirstName, LastName FROM Person.Contact;" FirstName ;LastName --------------------------------

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

请注意,如果还有其他数据类型,则需要使用:
CAST(MyColumnName AS varchar(32))将字段转换为MyColumnName

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

首先,我用一组特殊的参数调用存储过程。在我的例子中,当我用所有空值调用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生成的标头
  • -删除尾随空格
  • -设置最大行宽度
  • -s定义列分隔符

或者通过sed对输出进行后处理,如下所示:

sqlcmd ... | sed -e '2d'
要删除第二行吗


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

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

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

以下行:

findstr /R /C:"^[^-]*$" MyTableColumns.csv > MyTableHeader.csv
非常危险,因为它会删除所有包含“-”的行。 你最好看看findstr/?并使用类似于:

findstr /B /V /C:"-----" MyTableColumns.csv > MyTableHeader.csv
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"

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
sqlcmd-S server-d数据库-E-Q“exec mystoredprocesdure”-W-o my_headers.csv-m-1
set/p headers=my_data.csv
sqlcmd-S server-d数据库-E-Q“exec mystoredprocesdure”-W-m-1-h-1>>my_data.csv
另外,只有在使用select语句时,Top 0才是创建“仅头文件”的好选择。如果要调用存储过程,请研究使用FMTONLY ON仅从SP获取头

sqlcmd-S server-d数据库-E-Q“不计数;设置FMTONLY打开;执行MyStoredProcess”-W-o my_headers.csv-m-1

需要注意的是,FMTONLY ON不能用于SP的使用临时表。这是因为FMTONLY ON不执行SP。它只获取元数据。但如果列名来自执行前不存在的表,则无法获取这些列名

  • 特洛伊

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

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

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

我没有一次看到所有这些信息,并且认为下一个查找它的人可能会感激它

使用
-h-1
选项从输出中删除破折号(-----),并
设置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命令的结果集中取消连字符(-------------):

您可以通过1命令以简单的方式完成这一切,而无需任何脚本或文件操作

sqlcmd -d AdventureWorks -s ";" -Q "SET NOCOUNT ON; SELECT top 5 FirstName, LastName FROM Person.Contact" |findstr /v /c:"---"
添加
设置不计数
删除
(受影响的X行)
行。 添加
|findstr/v/c:“--”
以删除下划线。 这样,您可以得到一个清晰的答案,只需:

FirstName                                         ;LastName
Gustavo                                           ;Achong
Catherine                                         ;Abel
Kim                                               ;Abercrombie
Humberto                                          ;Acevedo
Pilar                                             ;Ackerman

如果要输出数据,可以设置以下开关:


设置下划线

我不得不做大量的研究,因为这里没有一个答案完全符合我的要求。所以我要总结一下,希望它能帮助其他人

对我来说,最简单的方法是使用
sed
。虽然这里已经提出了这一点,但同时运行sqlcmd和sed的语法不正确。如果您使用的是Windows,就像我一样,请直接下载sed

我最后的命令看起来像:

findstr /B /V /C:"-----" MyTableColumns.csv > MyTableHeader.csv
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"
哪里 -
-m1
删除了“将数据库上下文更改为…”行
-
&&
如果第一个命令成功运行,则运行第二个命令
-
sed-i 2d
删除包含连字符的第二行,并将sed的输出覆盖为原始输出

请注意,
sed
输出文件名和
sqlcmd
的输出必须匹配,否则将无法正确覆盖
sqlcmd
的输出。中的
2d
周围不应有引号
exec 'sqlcmd -S YourServer -E -Q "set nocount on; select * from YourTable" -s "," -W | findstr /R /C:"^[^-]*$" > yourfile.csv'
sqlcmd -S 12.34.56.789 -i "C:\Qry.sql" -s"," -W -w1000 | findstr /V /R /C:"^[-,]*$" > Reprt.csv
findstr /V /R /C:"^[-,]*$"
SET NOCOUNT ON;