Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TryParse SSIS忽略源行_Sql Server_Date_Ssis_Etl_Derived Column - Fatal编程技术网

Sql server TryParse SSIS忽略源行

Sql server TryParse SSIS忽略源行,sql-server,date,ssis,etl,derived-column,Sql Server,Date,Ssis,Etl,Derived Column,我有一个序列化的代码,在这段代码中有一些数字值,在解析时表示一个日期 For example, 011756420176654 *Note* array index may be off Substring(1,2) = 01 Substring(3,2) = 17 我试图忽略该行,而不替换原始行。我有一个派生列,并且正在该列中执行此操作 (dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + (dt

我有一个序列化的代码,在这段代码中有一些数字值,在解析时表示一个日期

For example, 011756420176654 
*Note* array index may be off
Substring(1,2) = 01
Substring(3,2) = 17
我试图忽略该行,而不替换原始行。我有一个派生列,并且正在该列中执行此操作

(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + (dt_str,10,1252)datepart("year",getdate()))
这里我的意图是配置错误输出,以便在派生列中的TryParse逻辑失败时忽略[My Code]字段。我知道如果我传递的是派生列,那么在配置中选择ignore将传递null,但问题是我试图错误地忽略源行并将其作为null传递,即[My Code]

一旦这个点击进入数据库,另一个进程就会使用它并尝试解析日期。它不会在null值上失败,所以我想在允许记录通过或将其设置为null之前验证它本质上是日期逻辑

编辑:根据基思的解决方案,我得出了这个结论。我在访问输出缓冲区时遇到了一些问题,但在对语法进行了一些MSDN之后,我想出了以下非常有效的方法

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        DateTime dateValue;
        string test = Row.ReceiptCode.Substring(0, 2) + "/" + Row.ReceiptCode.Substring(2, 2) + "/" + DateTime.Now.Year.ToString();

        if (DateTime.TryParse(test, out dateValue) && Row.ReceiptCode.Length ==16)
    {

        Output0Buffer.AddRow();

        Output0Buffer.EndDate = Row.EndDate;
        Output0Buffer.Q10 = Row.Q10;
        Output0Buffer.Q8 = Row.Q8;

        Output0Buffer.ValidatedReceipt = Row.ReceiptCode;
    }
    else 
    {
        Output1Buffer.AddRow();

        Output1Buffer.EndDate = Row.EndDate;
        Output1Buffer.Q10 = Row.Q10;
        Output1Buffer.Q8 = Row.Q8;
        Output1Buffer.Error = Row.ReceiptCode;
    }
}

我将使用脚本转换:

添加输出列convDate并选中[My Code],如下所示:

这是您的代码:

string test = Row.[My Code].Substring(1,2) + "/" + Row.[My Code].Substring(3,2)+"/" + DateTime.Now.Year.ToString();

if (DateTime.TryParse(test, out dateValue))
{Row.convDate = dateValue;  }
从性能角度来看,最好避免在使用简单表达式时使用脚本组件

派生列表达式中存在的问题是缺少第二个破折号,并指定50作为字符串长度,请尝试使用以下表达式:

(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + "-" +  (dt_str,50,1252)datepart("year",getdate()))
((dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2)) == (dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))) 
? [My Code] 
: NULL(dt_str,50,1252)
此外,在处理日期值时,最好使用通用日期格式YYYY-MM-DD:

(dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))
确保已将错误输出配置为忽略故障:

更新1 如果需要返回原始字符串值,请使用以下表达式:

(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + "-" +  (dt_str,50,1252)datepart("year",getdate()))
((dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2)) == (dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))) 
? [My Code] 
: NULL(dt_str,50,1252)

这闻起来像是脚本组件和派生列。是的,肯定更接近我要找的。你刚刚错过了第二个日期分隔符!!在脚本任务中,我假设这应该放在Input0Buffer中。。这将如上所述公开输入行。[我的代码],并允许我将输入解析为datetime变量。那么如何输出到convDate?是否需要执行类似Row.CreateNewOutPutRowsconvDate的操作?这似乎没有意义,因为我在设置中配置了输出行。输入和输出->输出0->输出列->转换日期我在脚本组件中看不到这一点。代码中包含了所有需要的c。但是,您正在SSIS GUI中挂断。在输入/输出选项卡上,选择[我的代码]进行读取。另外,在输出时,向输出0添加一个名为convDate的新列。这将允许您访问RowFound答案中的两列。。Output0Buffer.convDate=日期值;我不同意使用脚本组件,但您可以在派生列中实现这一点,特别是在实现非常简单的逻辑时,错误很简单—OP忘记在月份和年份之间添加分隔符。此外,他没有将datepart安排为yyyy\U MM-dd格式。Ok。我同意这是可行的,但在我的房子里追查错误却要了我的命gui@KeithL在这种情况下,OP需要实现一个tryparse逻辑,它不会在解析失败时引发错误。两者都有效。和我的一样。它试图解析。如果失败,则不写入任何内容,因此将保留列null。对我来说。修复两行代码比查找属性更容易。@KeithL,正如您所说,这两行代码都有效。公平地说,你会得到我的支持:我并不是说你错了。当我有100个包需要维护时,这只是我的一个偏好。