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