SQL Server BCP导出SQL字段中的逗号

时间:2018-09-04 16:17:10

标签: sql-server bcp

我已成功将文件导出到CSV。我使用以下代码导出文件:

exec xp_cmdshell 'bcp "[DC_TrainEnvironment].[dbo].[HAFacilities_Master]" out "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master.csv" -f "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_FORMAT.fmt" -o "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_LOG.txt" -T -S "HAPDBCDC02,2112"'

这很好,但是有问题。在某些字段中包含逗号。我正在使用以下格式文件:

enter image description here

在格式文件中我该怎么做,以避免必须更改整个格式文件?有没有一种快速的方法来指示字段终止符在某些字段中不会以逗号结尾?即“','“ 要么 ”'',''”?

感谢任何帮助。谢谢

3 个答案:

答案 0 :(得分:1)

如果您要导出的字段可以包含用于分隔文件中字段的字符,则您可以选择:

  1. 使用其他定界符-这似乎是最简单的方法。只需使用“ |”或“〜”作为分隔符。将“,”全局替换为“ |”与几乎所有文本编辑器一起使用的格式文件中。目前尚不清楚为什么很难修改“整个”文件。也许您有一个文件的收件人,要求用逗号分隔?

  2. 如果必须使用逗号作为分隔符,则必须将列分隔符从逗号(,)更改为quote-comma-quote(“,”)。为此,您需要使用转义符来使BCP程序忽略要在输出文件中用作定界符的引号,因此它不会将它们视为它理解为在格式文件中包含定界符的引号。 。所以...

代替...,使用...“ \”,\“”

这将导致以下结果

col1,col2,“ col,3”,col4

对于col1,分隔符为:,以格式文件表示此分隔符,请使用:“,”

对于col2,定界符为:,”以格式文件表示,使用:“,\””

对于col3,分隔符为:“,以格式文件表示此分隔符,请使用:“ \”,”

对于col4,分隔符为:,以格式文件表示此分隔符,请使用:“,”

我希望有帮助。

答案 1 :(得分:0)

非常困难。您将需要在bcp命令中选择列并替换逗号。

exec xp_cmdshell 'bcp "SELECT ''ColumnHeader'' UNION ALL SELECT REPLACE(Column1, '','', '''') FROM [DC_TrainEnvironment].[dbo].[HAFacilities_Master]" out "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master.csv" -f "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_FORMAT.fmt" -o "\\fspincdc01\data$\HIMSSAnalytics\Data Analyst\HG Data\Technical Documentation\HA Facilities\HAFacilities_Master_LOG.txt" -T -S "HAPDBCDC02,2112"'

答案 2 :(得分:0)

这是我的C#解决方案,您必须将其变形才能在SQL Server中使用,但仍然要使用模板:

private static void EliminateCommasInFields(List<string> files, string path)
{
    foreach (var f in files)
    {
        string filename = path + f.Substring(0, f.Length - 4);

        StreamReader sr = new StreamReader(filename);
        String[] rows = Regex.Split(sr.ReadToEnd(), "\r\n");
        sr.Close();
        StreamWriter sw = new StreamWriter(filename);

        for (int i = 0; i < rows.Length; i++)
        {
            //search the row for the dreaded ," (indicating a comma in the field)
            while (rows[i].IndexOf(",\"") > 0) 
                {
                    //find the position of the first ," and it's ending ",
                    int start = rows[i].IndexOf(",\""); 
                    int end = rows[i].IndexOf("\",");
                    //find the position of the first comma within this field
                    int comma = rows[i].IndexOf(",", start + 1, end - start);
                    while (comma > 0) //eliminate all the commas within this cell
                    {
                        //Replace the offending comma with a space 
                        rows[i] = rows[i].Substring(0, comma) + " " + rows[i].Substring(comma + 1, rows[i].Length - (comma + 1)); 
                        //Search for next comma
                        comma = rows[i].IndexOf(",", start + 1, end - start);
                    }
                    //Save the rest of the row eliminating the double quotes for this cell
                    rows[i] = rows[i].Substring(0, end ) + rows[i].Substring(end + 1, rows[i].Length - (end + 1));
                    rows[i] = rows[i].Substring(0, start + 1) + rows[i].Substring(start+ 2, rows[i].Length - (start + 2));

                }

            sw.WriteLine(rows[i]);
        }
        sw.Close();
    }
}