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

Sql server 如何在SQLCMD中使用TAB作为列分隔符,sql-server,sqlcmd,Sql Server,Sqlcmd,SQLCMD支持-s参数来指定列分隔符,但我不知道如何表示tab(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获得未格式化的结果 如果要创建

SQLCMD支持-s参数来指定列分隔符,但我不知道如何表示tab(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获得未格式化的结果

如果要创建以制表符分隔的输出文件,最好选择:

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

在批处理文件中,在双引号之间放置制表符是有效的

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,但我无法让它接受它。到目前为止,我最喜欢的工作是将ASCII“单位分隔符”(十六进制0x1F)传递给SQLCMD,它可以通过键入Ctrl-(控制下划线,在美国键盘上变成Ctrl shift-“-”(键盘顶行“0”旁边的“-”)在命令行中输入

使用“单元分隔符”的优点是,它不太可能出现在任何描述的文本中,并且是专门为此目的设计的(请参阅)

让SQLCMD为我做这件事之后,我通过一个Unix风格的translate命令将其输出管道化,如下所示:

tr '\037' '\t'
037是“单位分隔符”的八进制,\t代表制表符,“tr”将为我们翻译这两个字符,我们不需要依赖脚本或shell中的任何引用技巧

要在windows上获得“tr”,您可以从GnuWin32(请参阅)安装CoreUtils包,也可以重装并安装完整的Unix环境,如Cygwin(http://cygwin.com/)

将两者结合起来,我们得到:

sqlcmd ... -h-1 -W -k -r1 -s^_ ... | tr '\037' '\t'
这将为您提供带有选项卡的输出


查看我上面使用的其他选项,它们对于尝试从SQLCMD获得干净的输出是必不可少的(顺序:无标题、修剪空白、CRLF到空格、错误到STDERR(不是您的输出文件!),并且“^uu”是单位分隔符在命令行上的显示方式)将行数添加到查询或sql脚本中,否则将在输出中以试用消息的形式获得行数!

在这里找到了一个很好的答案:

  • 打开记事本
  • 粘贴以下内容:
    sqlcmd-S(本地)-E-S”“-Q“从sys.dm\u exec\u query\u stats中选择*”-o MyOutput.txt-h-1-W
  • 突出显示,然后按Tab键
  • 将文件另存为MyBatch.bat
  • 运行MyBatch.bat

  • 与上面的答案相似,但更简单的是,我认为这很重要

  • 打开文本编辑器
  • 按Tab键
  • 突出显示创建的空白块(选项卡)
  • 将其复制并粘贴到SQL命令中的位置
  • 尽管此选项卡表示为一大块空白,但它是单个字符


    另一个答案中有一些不必要的东西,关于在整个命令中粘贴
    ”。我认为这会让人反感(这肯定会让我反感)。

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

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

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


    sqlcmd-S ServerName-E-d数据库\u Name-Q“从mytable中选择col1,char(9),col2,char(9),col3,char(9),col4,char(9),col5”-o results.txt-W-W 1024-S“-m 1

    ALT+009分隔符的ascii制表符代码

    在本例中,将
    {ALTCHAR}
    替换为
    ALT+009
    (按住ALT键并输入数字009)

    编辑
    junk.txt
    。选项卡将位于列之间

    对于其他命令行选项:

    sqlcmd -?
    

    注意:shell将ALT char转换为^I,但是如果您通过键入-s“^I”来尝试该命令,则不会得到相同的结果。

    使用动态sql和
    char(9)


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

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

    按cntrl+v,然后按tab键


    回答得很好!!!!对于希望在PowerShell中执行此操作的其他人-请注意,
    -s
    后面的空格非常重要。:)
    sqlcmd -?
    
    SET @cmd ='SQLCMD -S MyServer -d MyDatabase -E -W -Q "SELECT * FROM MyTable" -s"' + CHAR(9) + '" -o "MyFilePath.txt"'