2014-09-29 10 views
4

Я SSIS noob (менее недели опыта), поэтому, пожалуйста, несите меня.
Я запускаю хранимую процедуру для экспорта ее результата в файл Excel.Экспорт SQL в Excel (xlsx) с использованием SSIS?

Из моего исследования я обнаружил, что приложение Excel для SSIS не отлично работает с файлами .xlsx (не может быть xls, так как в результате получается больше, чем 65K строк), но я обнаружил, что могу использовать OLE DB Назначение для записи в файл excel.

вопрос я вижу сообщение об ошибке, которое происходит на бегу, который говорит:

OLE DB Destination [212]] Error: 
An error occurred while setting up a binding for the "Main Job Notes" column. 
The binding status was "DT_NTEXT"." 

Поля, которые erroring приходят как текстовые потоки ([DT_TEXT]), и с тех пор я получаю сообщение об ошибка вокруг не будучи в состоянии преобразовать между Юникод и не-юникод, я использую преобразование данных, чтобы превратить его в текстовый поток Unicode ([DT_NTEXT])

Если это помогает вообще, мои настройки выглядит следующим образом:

enter image description here

Любая помощь будет потрясающей. Спасибо.

+1

Я видел провайдер JET действительно смешал SSIS/Excel когда текстовые данные превышают 255 символов, что подразумевается в случае, если вы используете DT_NTEXT. Попробуйте выставить длину до <255 в качестве теста, чтобы узнать, является ли это вашей проблемой. Если это так, вам придется решить, хотите ли вы чтобы жить с усечением, или, может быть, просто экспортировать в CSV или плоский файл (который я часто нахожу, это лучший маршрут). – Greenspark

+1

@Greenspark Да, пара этих полей - VARCHAR (макс). И один из них, когда вытаскивается прямо из SQL у студии управления есть около 80 000 символов, поэтому может произойти некоторое усечение. Я проверю 255 символов и отправлю отчет. – npiani

+0

@ Greenspark в порядке, усекающиеся работы. Теперь моя проблема заключается в том, что экспорт не сохраняет мой формат шаблона. – npiani

ответ

1

Вам следует подумать об этом, используя компонент сценария, помните, что при выполнении задачи потока данных вы не можете отлаживать напрямую, но вы можете использовать mbox для проверки результатов. Также имейте в виду, что excel всегда будет пытаться автоматически использовать типы данных столбцов, например, когда вы пытаетесь импортировать файл из Excel, если один из его столбцов начинается с числа, но в строке 3455 есть символ, он будет импортировать столбец в качестве номера, и вы потеряете значение char, вы найдете его как null в своей базе данных.

Я дам вам код для создания файла, который вам нужен программным путем, возможно, он может дать вам представление. (Этот пример читает файл как один столбец, то он будет разделен, как если бы вы выбрали фиксированные с разделителями значения в Excel и вывод будет в файле CSV.

/* Microsoft SQL Server Integration Services Script Component 
* Write scripts using Microsoft Visual C# 2008. 
* ScriptMain is the entry point class of the script.*/ 

using System; 
using System.IO; 
using System.Linq; 
using System.Text; 

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 
public class ScriptMain : UserComponent 
{ 

    #region Variables 
    private string _jumexDailyData; 
    private string[] _jumexValues; 
    private string[] _jumexWidthValues;  
    #endregion 

    /// <summary> 
    /// Default constructor 
    /// </summary> 
    public ScriptMain() 
    {   
     this._jumexValues = new string[22];   
    } 

    public override void PreExecute() 
    { 
     base.PreExecute(); 
     /* 
      Add your code here for preprocessing or remove if not needed 
     */ 
    } 

    public override void PostExecute() 
    { 
     base.PostExecute(); 
     /* 
      Add your code here for postprocessing or remove if not needed 
      You can set read/write variables here, for example: 
      Variables.MyIntVar = 100 
     */ 
    } 

    public override void JumexDailyData_ProcessInput(JumexDailyDataBuffer Buffer) 
    {   
     while (Buffer.NextRow()) 
      JumexDailyData_ProcessInputRow(Buffer);   
    } 

    public override void JumexDailyData_ProcessInputRow(JumexDailyDataBuffer Row) 
    { 
     this._jumexDailyData = Row.JumexDailyData; 
     if (this._jumexDailyData != null) 
     { 
      this._jumexWidthValues = this.Variables.JUMEXLOADSALESATTACHMENTFILEWIDTHVALUES.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); 
      if (this._jumexWidthValues != null && this._jumexWidthValues.Count() > 0) 
       for (int i = 0; i < this._jumexWidthValues.Count(); i++) 
       { 
        this._jumexValues[i] = this._jumexDailyData.Substring(0, int.Parse(this._jumexWidthValues[i])).Trim(); 
        this._jumexDailyData = this._jumexDailyData.Substring(int.Parse(this._jumexWidthValues[i]), (this._jumexDailyData.Length - int.Parse(this._jumexWidthValues[i]))); 
       } 

      if (string.IsNullOrEmpty(this._jumexValues[3].Trim()) == false && 
       string.IsNullOrEmpty(this._jumexValues[17].Trim()) == false && 
       !this._jumexValues[3].Contains("---") && 
       !this._jumexValues[17].Contains("---") && 
       !this._jumexValues[3].Trim().ToUpper().Contains("FACTURA") && 
       !this._jumexValues[17].Trim().ToUpper().Contains("PEDIDO"))     
       using (StreamWriter streamWriter = new StreamWriter(this.Variables.JUMEXFULLQUALIFIEDLOADSALESATTACHMENTFILENAME.Replace(".TXT", ".CSV"), true, Encoding.Default)) 
       { 
        streamWriter.WriteLine(string.Join("|", this._jumexValues)); 
       } 
     }   
    } 

} 
Смежные вопросы