SQLCMD 支持 -s 参数来指定列分隔符,但我不知道如何表示制表符 (CHAR(9)) 字符。我尝试了以下方法,但都不起作用:
sqlcmd -S ServerName -E -Q"select * from mytable" -s"\t" -o results.txt
sqlcmd -S ServerName -E -Q"select * from mytable" -s'\t' -o results.txt
任何想法如何在 SQLCMD 中执行此操作?
SQLCMD 支持 -s 参数来指定列分隔符,但我不知道如何表示制表符 (CHAR(9)) 字符。我尝试了以下方法,但都不起作用:
sqlcmd -S ServerName -E -Q"select * from mytable" -s"\t" -o results.txt
sqlcmd -S ServerName -E -Q"select * from mytable" -s'\t' -o results.txt
任何想法如何在 SQLCMD 中执行此操作?
在批处理文件中,在双引号之间放置一个制表符是可行的。
sqlcmd -S ServerName -E -Q"select * from mytable" -s" " -o results.txt
要在 PowerShell 文件中执行相同操作,请在转义选项卡周围使用转义双引号
sqlcmd -S ServerName -E -Q"select * from mytable" -s `"`t`" -o results.txt
很难从 SQLCMD 获得未格式化的结果。
如果要创建制表符分隔的输出文件,BCP可能是更好的选择:
bcp "select * from mytable" queryout results.txt -S server -T -c
在这里找到了一个很好的答案:SQLCMD outfile as tab delimited text file
- 打开记事本
- 粘贴这个:
sqlcmd -S (local) -E -s"<TAB>" -Q "select * from sys.dm_exec_query_stats" -o MyOutput.txt -h-1 -W
- 突出显示<TAB>,然后按一下Tab键
- 将文件另存为 MyBatch.bat
- 运行 MyBatch.bat
我已经多次尝试将实际的 TAB 字符传递给 SQLCMD,但我根本无法接受它。迄今为止,我最喜欢的解决方法是向 SQLCMD 传递 ASCII“单位分隔符”,即十六进制 0x1F,并且可以通过键入 Ctrl-_ 在命令行中输入(控制下划线,在美式键盘上变为 ctrl-shift -'-'(键盘顶行“0”旁边的“-”)。
使用“单位分隔符”的优点是极不可能出现在任何描述的文本中,并且是专门为此目的而设计的(请参阅https://en.wikipedia.org/wiki/Delimiter)
让 SQLCMD 为我做这件事后,我通过 Unix 风格的翻译命令将其输出管道传输为:
tr '\037' '\t'
\037 是“单位分隔符”的八进制,\t 表示制表符,“tr”将为我们翻译这两者,我们不需要依赖脚本或 shell 中的任何引用技巧。
要在 Windows 上获得 'tr',您可以从 GnuWin32 安装 CoreUtils 包(请参阅http://gnuwin32.sourceforge.net/packages/coreutils.htm)或使用重量级并安装完整的 Unix 环境,例如 Cygwin(http ://cygwin.com/)。
将两者放在一起,我们得到:
sqlcmd ... -h-1 -W -k -r1 -s^_ ... | tr '\037' '\t'
这将为您提供带有标签的输出。
查找我上面使用的其他选项,它们对于尝试从 SQLCMD 获得干净的输出至关重要(按顺序;没有标题,修剪空白,CRLF 到空格,错误到 STDERR(不是你的输出文件!)和'^_' 是单位分隔符在命令行上的显示方式)。您还需要添加“SET NOCOUNT ON;” 到您的查询或 sql 脚本,否则您将获得行数作为出现在输出中的试用消息!
与上面发布的答案类似,但在我认为重要的方面它更简单。
尽管此选项卡表示为一大块空白,但它是单个字符。
另一个答案有一些关于将整个命令粘贴到其中的不必要的东西"<TAB>"
。我认为这会让人们失望(它肯定让我失望)。
要在命令提示符窗口中而不是在批处理文件中工作,这是我发现解决它的唯一方法:
sqlcmd -S ServerName -E -d database_Name -Q"select col1, char(9) , col2, char(9) , col3, char(9) , col4, char(9) , col5 from mytable" -o results.txt -W -w 1024 -s "" -m 1
尝试在 cmd.exe 或 powershell 中使用水平滚动条。右键快捷方式并单击属性以重复使用,或右键单击标题栏并打开后单击属性然后单击布局选项卡。在屏幕缓冲区大小中,将宽度和高度设置为 8000,然后取消选择在调整大小时换行输出(重要)。单击确定。然后通过单击旁边的按钮以最小化来恢复。您应该会看到水平和垂直滚动条。您现在可以最大化窗口并在任何方向滚动。现在您可以看到数据库中的所有记录。
使用动态 sql CHAR(9)
:
SET @cmd ='SQLCMD -S MyServer -d MyDatabase -E -W -Q "SELECT * FROM MyTable" -s"' + CHAR(9) + '" -o "MyFilePath.txt"'
tldr:使用ALT+009
ascii 制表符代码作为分隔符
在示例中,替换{ALTCHAR}
为ALT+009
(按住 ALT 键并输入数字 009)
sqlcmd -E -d tempdb -W -s "{ALTCHAR}" -o junk.txt -Q "select 1 c1,2 c2,3 c3"
编辑junk.txt
. 选项卡将位于列之间。
对于其他命令行选项:
sqlcmd -?
注意:shell 将 ALT 字符转换为 ^I,但如果您通过键入 -s "^I" 来尝试该命令,您将不会得到相同的结果。
如果在 Linux 上,那么这将作为 -s (col_separator)
-s "$(printf "t" | tr 't' '\t')" 或
SQLCMDCOLSEP="$(printf "t" | tr 't' '\t')" sqlcmd -S ...
要使用 sqlcmd 实现此目的,您需要使用 Tab 字符,如下所示: \t 使用制表符分隔符将单个 sql 数据库表导出到文本文件的示例查询如下:
sqlcmd -S ServerName -d databaseTableName -Q "SELECT * FROM TABLE_NAME" -o C:\backups\tab_delimiter_bakup.txt -s"\t"