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定义列分隔符
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;