【问题标题】:How to use TAB as column separator in SQLCMD如何在 SQLCMD 中使用 TAB 作为列分隔符
【发布时间】:2010-09-30 10:09:21
【问题描述】:

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

【问题讨论】:

    标签: sql-server sqlcmd


    【解决方案1】:

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

    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
    

    【讨论】:

    • 很好的答案!!!!对于希望在 PowerShell 中执行此操作的其他人 - 请注意 -s 之后的空格很重要。 :)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在这里找到了一个很好的答案: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
      4. 将文件另存为 MyBatch.bat
      5. 运行 MyBatch.bat

      【讨论】:

        【解决方案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 脚本,否则您将获得行数作为出现在输出中的试用消息!

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

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

            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

            【讨论】:

              【解决方案7】:

              CHAR(9)使用动态sql:

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

                  按 cntrl + v 然后按 tab。

                  How to enter a tab char on command line?

                  【讨论】:

                    【解决方案10】:

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

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

                    【讨论】:

                      【解决方案11】:

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

                      【讨论】:

                        【解决方案12】:

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

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

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

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-07-17
                          相关资源
                          最近更新 更多