如何导出执行计划 XML 并获取表中的列名称?

问题描述 投票:0回答:1

我需要从 sqlcmd 获取实际执行计划的全文和包含列名的完整结果表。我的第一个要求迫使我按照

这里
的记录传递-y 0。但是,这似乎禁用了我的表输出中出现的列名称。我在文档中找不到任何对此的引用。那么我怎样才能既传入
-y 0
又获取列名呢?

无法选择 sqlcmd 的替代品。我使用 sqlcmd 是因为据我所知,Emacs 要求我必须这样做,而且 Emacs 是我所知道的 Linux 上 Microsoft SQL Server 的唯一 IDE。我的版本是

~$: sqlcmd -?

Microsoft (R) SQL Server 命令行工具
Linux 版本 18.2.0001.1
版权所有 (C) 2017 微软公司。保留所有权利。

sql-server command-line-interface sqlcmd output-formatting
1个回答
0
投票

不知道是否有任何相关文档,但我最近有幸阅读了 sqlcmd-go 源代码,在这里我们可以看到标题是如何打印的:

https://github.com/microsoft/go-sqlcmd/blob/main/pkg/sqlcmd/format.go#L150

if f.vars.RowsBetweenHeaders() > -1 && f.format == "horizontal" && !f.xml {
        f.printColumnHeadings()
    }

查找 RowsBetweenHeaders 定义,它说:

https://github.com/microsoft/go-sqlcmd/blob/main/pkg/sqlcmd/variables.go#L164

// RowsBetweenHeaders is the value of SQLCMDHEADERS variable.
// When MaxVarColumnWidth() is 0, it returns -1
func (v Variables) RowsBetweenHeaders() int64 {
    if v.MaxVarColumnWidth() == 0 {
        return -1
    }
    h := mustValue(v[SQLCMDHEADERS])
    return h
}

所以这两个设置似乎是相互对立的。

您可能会幸运地添加问题或拉取请求来添加另一个打印标题的选项,例如: --always-print-long-values-as-if-max-width-is-0-but-标题仍然可以打印。

© www.soinside.com 2019 - 2024. All rights reserved.