12

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 中执行此操作?

4

12 回答 12

23

在批处理文件中,在双引号之间放置一个制表符是可行的。

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
于 2011-05-25T15:51:26.973 回答
10

很难从 SQLCMD 获得未格式化的结果。

如果要创建制表符分隔的输出文件,BCP可能是更好的选择:

bcp "select * from mytable" queryout results.txt -S server -T -c
于 2010-09-30T10:46:57.447 回答
6

在这里找到了一个很好的答案:SQLCMD outfile as tab delimited text file

  1. 打开记事本
  2. 粘贴这个:sqlcmd -S (local) -E -s"<TAB>" -Q "select * from sys.dm_exec_query_stats" -o MyOutput.txt -h-1 -W
  3. 突出显示<TAB>,然后按一下Tab
  4. 将文件另存为 MyBatch.bat
  5. 运行 MyBatch.bat
于 2013-01-18T23:20:41.727 回答
4

我已经多次尝试将实际的 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 脚本,否则您将获得行数作为出现在输出中的试用消息!

于 2012-06-12T05:14:43.997 回答
3

与上面发布的答案类似,但在我认为重要的方面它更简单。

  1. 打开你的文本编辑器
  2. Tab
  3. 突出显示创建的空白块(选项卡)
  4. 将其复制并粘贴到 SQL 命令中的位置

尽管此选项卡表示为一大块空白,但它是单个字符。

另一个答案有一些关于将整个命令粘贴到其中的不必要的东西"<TAB>"。我认为这会让人们失望(它肯定让我失望)。

于 2013-11-04T23:02:58.467 回答
1

要在命令提示符窗口中而不是在批处理文件中工作,这是我发现解决它的唯一方法:

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

于 2018-06-14T17:57:49.150 回答
0

尝试在终端上运行 sqlcmd 时遇到了这个问题。我通过输入制表符使其工作(从文本编辑器复制对我不起作用)。

按 cntrl + v 然后制表符。

如何在命令行上输入制表符?

于 2020-04-07T22:50:15.827 回答
0

尝试在 cmd.exe 或 powershell 中使用水平滚动条。右键快捷方式并单击属性以重复使用,或右键单击标题栏并打开后单击属性然后单击布局选项卡。在屏幕缓冲区大小中,将宽度和高度设置为 8000,然后取消选择在调整大小时换行输出(重要)。单击确定。然后通过单击旁边的按钮以最小化来恢复。您应该会看到水平和垂直滚动条。您现在可以最大化窗口并在任何方向滚动。现在您可以看到数据库中的所有记录。

于 2019-12-31T05:08:58.533 回答
0

使用动态 sql CHAR(9)

SET @cmd ='SQLCMD -S MyServer -d MyDatabase -E -W -Q "SELECT * FROM MyTable" -s"' + CHAR(9) + '" -o "MyFilePath.txt"'
于 2019-09-12T23:14:42.057 回答
-1

tldr:使用ALT+009ascii 制表符代码作为分隔符

在示例中,替换{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" 来尝试该命令,您将不会得到相同的结果。

于 2018-11-18T14:13:27.140 回答
-1

如果在 Linux 上,那么这将作为 -s (col_separator)

-s "$(printf "t" | tr 't' '\t')" 或

SQLCMDCOLSEP="$(printf "t" | tr 't' '\t')" sqlcmd -S ...

于 2021-10-24T12:32:39.723 回答
-1

要使用 sqlcmd 实现此目的,您需要使用 Tab 字符,如下所示: \t 使用制表符分隔符将单个 sql 数据库表导出到文本文件的示例查询如下:

sqlcmd -S ServerName -d databaseTableName -Q "SELECT * FROM TABLE_NAME" -o C:\backups\tab_delimiter_bakup.txt -s"\t"
于 2015-12-18T18:35:50.940 回答