ssis заменяет ноль на пустую строку - PullRequest
0 голосов
/ 17 сентября 2018

Я использую условное разделение в службах SSIS и получаю ошибки, так как некоторые строки содержат значения NULL. Я знаю, что это можно изменить с помощью производного столбца и функции REPLACENULL. Однако в моей таблице около 200 столбцов, и это было бы очень утомительно.

Мне было интересно, могу ли я что-нибудь сделать, используя Script Component, который бы циклически проходил по всем строкам и заменял любые NULLS на пустую строку?

1 Ответ

0 голосов
/ 17 сентября 2018

Если вы не можете выполнить преобразование данных в выбранном источнике, вы можете сделать это на Script Component в вашем DataFlow.

Перед передачей потока данных на conditional split вы можете добавить Script Component, как показано ниже:

enter image description here

Тогда в вашем компоненте скрипта вы должны иметь следующий код:

using Microsoft.SqlServer.Dts.Runtime.Wrapper;

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

    public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer)
    {
        while (Buffer.NextRow())
        {
            var cols = Buffer.ColumnCount;
            //loop through each column
            for (var i = 0; i < cols; i++)
            {
                //get datatype of the column
                var type = Buffer.GetColumnInfo(i).DataType;
                //only operate on columns of type DT_STR or DT_WSTR
                if (type == DataType.DT_STR || type == DataType.DT_WSTR)
                {
                    //grab the data from the column and trim it
                    var colData = Buffer[i].ToString().Trim();
                    if (string.IsNullOrEmpty(colData))
                    {
                        //if the trimmed data is blank or null, set the output to null
                        Buffer.SetNull(i);
                    }
                    else
                    {
                        //if the column has data, set the output to the trimmed version
                        Buffer.SetString(i, colData);
                    }
                }
            }
        }
    }


}

Но, как я уже сказал, и это упоминается в комментарии, лучший способ, если это возможно, это делать в select, когда вы хотите читать данные из вашего источника.

Select 
    ISNULL(A.Field1,'') AS Field1,
    ISNULL(A.Field2,'') AS Field2,
    ....
FROM A  
...