我在其他字符数据中间有一个带有2个星号的字段。我需要检索星号之间的值。例如,我有
DOE*JOHN*L
,我需要JOHN
。
我写了以下内容:
SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) + 1, (FINDSTRING(TRIM(EMPLOYE_NAME),"*",2) - FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) - 2))
当我尝试运行它时,我收到一条DTS_E_INDUCEDTRANSFORMFAILUREONERROR
消息,但它失败了。
如果我最后删除-2,则可以使用,但是我还有2个额外的字符。因此,使用上面的示例,我将得到JOHN*L
。
我已经在SSIS包的派生列中找到了它。这是将固定长度的文件导入SQL Server的过程的一部分。
有什么想法可以使这项工作成功吗?
答案 0 :(得分:0)
如果您知道您一直想要第一个星号和第二个星号之间的数据,那么我将使用脚本组件和Split()
string[] strs = Row.str.ToString().Split('*');
Row.BetweenStars = strs[1]; //Note Split is 0 based and 1 is the second value in the array
确保将str(列的我的名字)添加为只读输入。
将betweenStars添加为数据类型字符串长度为255的输出。
编辑:
更仔细地查看您的数据,我认为您的数据实际上可能是这样的:
姓[星]名[星]中
在这种情况下,您可以使用split设置全部3个。
LastName = strs[0];
FirstName = strs[1];
Middle = strs[2];
在评论1星或2星后编辑:
string[] strs = Row.str.ToString().Split('*');
if (strs.Length == 2)
{
//This is where first name and last name only exist
Row.LastName = strs[0];
Row.FirstName = strs[1];
Row.Middle_IsNull = true;
}
else
{
//This is where all 3 exist
Row.LastName = strs[0];
Row.FirstName = strs[1];
Row.Middle = strs[2];
}
答案 1 :(得分:0)
您可以在SQL中使用CHARINDEX
而不是FINDSTRING
来做到这一点:
SUBSTRING(EMPLOYE_NAME, CHARINDEX('*',EMPLOYE_NAME) + 1, CHARINDEX('*',EMPLOYE_NAME,CHARINDEX('*',EMPLOYE_NAME)))
我用'DOE*JOHN*L'
和'DOE*JOHN'
进行了测试,都返回了JOHN
。
编辑:
创建了关于添加条件拆分的冗长文章之后,我发现了原始Derived Column
表达式的问题。我能够使用以下表达式来处理带有1个空格,1个星号或2个星号的名称。确保表达式字符串中没有换行符或回车符。
LEN(EMPLOYE_NAME) - LEN(REPLACE(EMPLOYE_NAME," ","")) == 1 ? (SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME)," ",1) + 1,LEN(EMPLOYE_NAME)) ): (FINDSTRING(TRIM(EMPLOYE_NAME),"*",2) > 0? (SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) + 1,(FINDSTRING(TRIM(EMPLOYE_NAME),"*",2) - FINDSTRING(TRIM(EMPLOYE_NAME),"*",1)) - 1)): (SUBSTRING(TRIM(EMPLOYE_NAME),FINDSTRING(TRIM(EMPLOYE_NAME),"*",1) + 1,(LEN(EMPLOYE_NAME) - FINDSTRING(TRIM(EMPLOYE_NAME),"*",1)))))