如何在SQLCMD中使用TAB作为列分隔符

时间:2010-09-30 10:09:21

标签: sql-server 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中执行此操作?

11 个答案:

答案 0 :(得分:17)

在批处理文件中,在双引号之间放置一个标签。

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

答案 1 :(得分:10)

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

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

bcp "select * from mytable" queryout results.txt -S server -T -c

答案 2 :(得分:4)

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

  
      
  1. 打开记事本
  2.   
  3. 粘贴: sqlcmd -S (local) -E -s"<TAB>" -Q "select * from sys.dm_exec_query_stats" -o MyOutput.txt -h-1 -W
  4.   
  5. 突出显示&lt; TAB&gt; ,然后点击标签
  6.   
  7. 将文件另存为MyBatch.bat
  8.   
  9. 运行MyBatch.bat
  10.   

答案 3 :(得分:3)

我已经多次尝试将实际的TAB字符传递给SQLCMD,而我根本无法接受它。我最喜欢的解决方法是将SQLCMD传递给ASCII“单位分隔符”,它是十六进制0x1F,可以通过键入Ctrl-_(控制下划线,在美国键盘上变为ctrl-shift)在命令行输入-'-'(键盘顶行'0'旁边的' - '。

使用“单位分隔符”的优点是很可能不会出现在任何描述的文本中,并且专门为此目的而设计(参见https://en.wikipedia.org/wiki/Delimiter

有了SQLCMD为我做这件事,然后我通过Unix风格的翻译命令输出它的输出:

tr '\037' '\t'

\ 037是'Unit Separator'的八进制,\ 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脚本,否则你会得到行计数作为你的输出中出现的试验消息!

答案 4 :(得分:2)

上面发布的一个类似的答案,但是我认为它更为简单。

  1. 打开文本编辑器
  2. Tab
  3. 突出显示创建的空格(选项卡)块
  4. 将其复制并粘贴到SQL命令中的位置
  5. 即使此选项卡表示为一大块空白,它也只是一个字符。

    另一个答案有一些不必要的东西,即用"<TAB>"粘贴整个命令。我认为这会让人失望(它肯定会让我失望)。

答案 5 :(得分:1)

要在批处理文件中使用命令提示符窗口,这是我找到解决它的唯一方法:

sqlcmd -S ServerName -E -d database_Name -Q“select col1, char(9),col2, char(9),col3, char (9),col4, char(9),来自mytable的col5“-o results.txt -W -w 1024 -s”“-m 1

答案 6 :(得分:0)

将动态SQL与CHAR(9)一起使用:

SET @cmd ='SQLCMD -S MyServer -d MyDatabase -E -W -Q "SELECT * FROM MyTable" -s"' + CHAR(9) + '" -o "MyFilePath.txt"'

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

按cntrl + v,然后按Tab。

How to enter a tab char on command line?

答案 9 :(得分:-1)

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

sqlcmd -S ServerName -d databaseTableName -Q "SELECT * FROM TABLE_NAME" -o C:\backups\tab_delimiter_bakup.txt -s"\t"

答案 10 :(得分:-1)

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”来尝试命令,则不会得到相同的结果。