【问题标题】:Exporting CSV data using SQLCMD.EXE使用 SQLCMD.EXE 导出 CSV 数据
【发布时间】:2010-10-08 15:09:34
【问题描述】:

我正在尝试将数据从 SQL Server 导出为 CSV 格式。我有一个定期运行的蝙蝠任务。命令是:

SQLCMD.EXE -d [db details] -i c:\export.sql -o c:\export.csv -s"," -W 

SQL 文件只是视图中的 SELECT *。

除了某些行在数据中有逗号之外,这有效,因此需要引用这些值。我可以将列分隔符更改为“','”,但是我还需要 SQL Server 来转义数据中的单引号。

不幸的是,将分隔符更改为另一个字符不太可能在 100% 的情况下解决问题,因为其中一个字段包含来自另一个应用程序的序列化数据,其中包含各种奇怪和奇妙的字符。

有什么方法可以让我获得标准的、引用的 CSV 数据?

【问题讨论】:

    标签: sql-server csv sqlcmd


    【解决方案1】:

    您应该能够修改 SELECT 语句以使用 QUOTENAME 函数。当然,您必须单独列出所有列,而不是使用SELECT *

    注意:在屏幕上可能难以阅读,但 QUOTENAME 的第二个参数是:

    {单引号} {双引号} {单引号}

    SELECT QUOTENAME(Column1, '"'), QUOTENAME(Column2, '"')
        FROM YourView
    

    【讨论】:

    • 如何让NULL输出到""?
    • 在批处理文件中,就像这样的魅力(启用延迟扩展,并用双引号来转义“字符):SELECT QUOTENAME(FieldName, '""'), ....
    • 要使用可移植 SQL 转换 NULL,请使用 COALESCE(field1, '')。 COALESCE 可以接受多个可能为 null 的参数,它会返回第一个不为 null 的参数。
    • 请注意QUOTENAME 限制为 128 个字符。大于 128 个字符的输入返回 NULL,因此对于较长的文本无用。
    • 这对我很有帮助,因为我的字段都只有 100 个字符长。但我也对使用超过 128 个字符的字段的方法感兴趣......也许将几个小子字符串(全部使用 QuoteName)连接成一个长字符串?无论如何,我很感谢这个答案,因为它对我有很大帮助,但是@djangofan 指出,在 CMD/SQLCMD 行中,我必须使用 2 个双引号作为转义机制。
    猜你喜欢
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多