SQL Server查询结果首列负值无法导出至CSV/文本文件的问题排查与解决建议
问题根源分析
我一眼就看出问题出在你用的findstr参数上——你当前的写法会把所有行首带-的记录都过滤掉,而首列为负值的记录正好行首就是-,自然就被漏掉了!
具体来说,你命令里的findstr /V /C:"-" /B逻辑有问题:
/B表示只匹配行首的字符/V表示排除所有匹配到的行/C:"-"指定匹配字符-
你原本想用这个命令去掉sqlcmd输出里的分隔线(全由-组成的行),但这个写法太宽泛,把正常的负值记录也一并过滤了。
可行解决方案
我给你两个稳妥的修改方案,任选其一即可:
方案1:精准过滤分隔线行
把findstr的参数改成只排除全由-组成的行,这样就不会影响首列为负值的记录了。修改后的完整命令如下:
sqlcmd -S . -d MYDB -E -s"|" -W -i D:\Activity_Inc.sql | findstr /V "^-*$" > D:\ST_Activity-%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%.csv
解释一下新的findstr参数:
^-*$是正则匹配规则,^表示行首,$表示行尾,-*表示0个或多个-,合起来就是匹配整行都是-的行,完美命中sqlcmd输出的分隔线。/V依然是排除这些行,这样就只去掉无用的分隔线,保留所有正常数据行(包括首列为负值的)。
方案2:让sqlcmd直接不输出分隔线
如果你不需要sqlcmd输出的表头和分隔线,也可以直接在sqlcmd里加参数-h-1,这样就不会输出表头和分隔线,也就不需要findstr过滤了,命令更简洁:
sqlcmd -S . -d MYDB -E -s"|" -W -h-1 -i D:\Activity_Inc.sql > D:\ST_Activity-%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%.csv
解释:-h-1参数告诉sqlcmd不要输出列标题和分隔线,直接输出纯数据行,省去了后续过滤的步骤,适合不需要表头的场景。
额外小提示
你的文件名里用了%time%,如果是上午的时间,小时部分会是个位数(比如9点就是 9,前面有空格),生成的文件名会带空格,建议改成这样处理空格:
D:\ST_Activity-%date:~6,4%%date:~3,2%%date:~0,2%%time: =0:%time:~0,2%%time:~3,2%.csv
%time: =0%会把时间里的空格替换成0,不管上午还是下午,文件名里的时间都是两位数字,避免空格带来的问题。
内容的提问来源于stack exchange,提问作者Meen
相关产品推荐
相关产品推荐

