我在 SQL Server 2005 中运行一个简单的查询,并希望通过 sqlcmd 将其导出到文件。我希望以 csv 格式获取结果,而不包含标题和查询元数据(有多少行受到影响)。对于标题,您实际上可以指定 -h -1,但如何摆脱结尾文本?
现在我有
sqlcmd -S klingon -d stardb -i C:\testscript.sql -o C:\testresults.csv -h -1 -s ","
剧本很简单,
select x, y, z from agent
不幸的是,结果如下:
24 aingles1 creablegs
25 tbails12 bull2dog12
26 jtaylor3 Leandon62606
27 forrestw1 nuke19211
(4 rows affected)
我似乎无法在帮助文件中找到任何内容来告诉我如何删除最后一部分,该部分告诉我有多少行受到影响。
有人有想法吗?
答案1
我认为您可能需要“SET NOCOUNT ON”选项。您的 SQL 脚本将如下所示:
set nocount on
select x, y, z from agent
set nocount off
结果集如下:
24 aingles1 creablegs
25 tbails12 bull2dog12
26 jtaylor3 Leandon62606
27 forrestw1 nuke19211
减去末尾的行数。
答案2
我将以下代码块添加到查询本身的开头,以便在使用 sqlcmd.exe 将结果导出为 CSV 时删除所有消息。
-- Suppress warnings and messages like (2 rows effected)
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
-- SQLCMD.exe batch command
:setvar SQLCMDERRORLEVEL 1
-- To Reenable
--:setvar SQLCMDERRORLEVEL 0
/**********************************************************************************
** DISABLING WARNINGS AND MESSAGES
** Disable "Changed database context to 'DatabaseName'." message in the CSV file when using
** SQLCMD.exe. You'll get a syntax error when executing this query in Management
** Studio if SQLCMD Mode is not enabled [Query] --> [SQLCMD Mode].
** :setvar SQLCMDERRORLEVEL 1 is used to disable messages like (152 Rows affected).
**********************************************************************************/
答案3
sqlcmd -S svr -d db ... | findstr /v "rows affected"
findstr
内置于操作系统中,与 grep 类似。请参阅 findstr /? 了解更多选项。
要删除列,请使用cut.exe
工具.因此你可以运行:
sqlcmd -S svr -d db ... | cut -c10-
这将仅输出从第 10 个字符开始的内容,从而删除行号。相应地调整数字 10。您也可以尝试字段:
sqlcmd -S svr -d db ... | cut -f2-
这只会输出字段 2 及以后(向右)。