【问题标题】:SQL- BCP export from with headers and quotesSQL-BCP 从带有标题和引号的导出
【发布时间】:2020-01-17 06:08:39
【问题描述】:

我正在尝试将数据从 SQL 视图导出到 CSV。 CSV的格式如下:

"SampleNo","Analysis Code","Analyte Name","Old Result","New Result","ChangeDate", "AD03861","$AIR","1,2,4-三甲基苯","--------","0.0001","12/28/2015 4:52:50 PM",

我能够得到字段周围的引号,但没有标题。而且我能够获得标题但没有引号。我尝试将两者结合并得到以下错误。

开始复制... SQLState = S0022,NativeError = 207 错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]列名无效 e 'SAMPNO'。 SQLState = S0022,NativeError = 207 错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]列名无效 e'ACODE'。 SQLState = S0022,NativeError = 207 错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]列名无效 e'ANLNAME'。 SQLState = S0022,NativeError = 207 错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]列名无效 e“旧结果”。 SQLState = S0022,NativeError = 207 错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]列名无效 e“新结果”。 SQLState = S1000,NativeError = 0 错误 = [Microsoft][ODBC Driver 13 for SQL Server]无法解析列级别 排序规则

BCP 复制失败

bcp "select CHAR(34)+SAMPNO+CHAR(34),CHAR(34)+ACODE+CHAR(34),CHAR(34)+ANLNAME+CHAR(34),CHAR(34)+OLDRESULT+CHAR(34),CHAR(34)+NEWRESULT+CHAR(34) union all select CHAR(34)+SAMPNO+CHAR(34),CHAR(34)+ACODE+CHAR(34),CHAR(34)+ANLNAME+CHAR(34),CHAR(34)+OLDRESULT+CHAR(34),CHAR(34)+NEWRESULT+CHAR(34) FROM TEST.dbo.MODIFY_EXPORT" QUERYOUT c:\temp\test.csv -S SERV2012R2 -U sa -P password -c -t","

【问题讨论】:

  • 这适用于标题: bcp "select 'SAMPNO', 'ACODE', 'ANLNAME', 'OLDRESULT', 'NEWRESULT' union all select SAMPNO, ACODE, ANLNAME, OLDRESULT, NEWRESULT FROM TEST .dbo.MODIFY_EXPORT" QUERYOUT c:\temp\test.csv -S SERV2012R2 -U sa -P 密码 -c -t","
  • 这适用于引号: bcp "select CHAR(34)+SAMPNO+CHAR(34),CHAR(34)+ACODE+CHAR(34),CHAR(34)+ANLNAME+CHAR( 34),CHAR(34)+OLDRESULT+CHAR(34),CHAR(34)+NEWRESULT+CHAR(34) FROM TEST.dbo.MODIFY_EXPORT" 查询 c:\temp\test.csv -S SERV2012R2 -U sa -P密码 -c -t","

标签: sql-server csv bcp


【解决方案1】:

尝试将标题用单引号括起来:

bcp "select CHAR(34)+''SampleNo''+CHAR(34),CHAR(34)+''Analysis Code''+CHAR(34),CHAR(34)+''Analyte Name''+CHAR(34),CHAR(34)+''Old Result''+CHAR(34),CHAR(34)+''New Result''+CHAR(34),CHAR(34)+''ChangeDate''+CHAR(34) union all select CHAR(34)+SAMPNO+CHAR(34),CHAR(34)+ACODE+CHAR(34),CHAR(34)+ANLNAME+CHAR(34),CHAR(34)+OLDRESULT+CHAR(34),CHAR(34)+NEWRESULT+CHAR(34),CHAR(34)+CHANGEDATE+CHAR(34) FROM TEST.dbo.MODIFY_EXPORT" QUERYOUT c:\temp\test.csv -S SERV2012R2 -U sa -P password -c -t","

注意: 我更改了您的示例代码以使用示例输出中的标题信息。

【讨论】:

    【解决方案2】:

    我认为使用 BCP 处理引用数据元素的正确方法是使用格式文件。我过去已经给出了这个答案:

    SQL Server BCP Bulk insert Pipe delimited with text qualifier format file

    我认为这比在您的实际查询中添加引号更好的原因是引号不是您希望传输的数据。引号只是格式化。因此,以后阅读您的代码以将格式信息保留在 BCP 命令本身而不嵌套在查询中的其他人会更有意义。

    获取包含在数据文件中的标题是一个单独的问题,您似乎使用“联合”查询正确处理该问题,以将标题行和数据行混合在一起,形成一个带有“queryout”的结果。

    请注意,以这种方式将标头添加到文件中时,您可能仍会遇到数据转换错误。因此,您必须将所有传出数据转换为“char/varchar”数据类型。由于您使用“联合”将标题记录(默认情况下所有 varchar 数据,因为您没有明确地转换它们)与您的详细数据(可能是一些 int、数字、数据数据类型混合在一起,因为它们存储在您的 TEST .dbo.MODIFY_EXPORT 表)必须将标题和详细查询混合到一个结果中,并且两个查询之间的每一列的数据类型必须匹配。

    注意,您还可以将标题和详细记录作为两个单独的文件(2 个单独的 bcp 命令)查询/bcp,然后将它们与 OS/脚本命令合并在一起。

    【讨论】:

      猜你喜欢
      • 2020-07-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多