我们正在尝试使用ADLA中的U-SQL从表中发布数据。我们使用下面的代码来获取FirstName的子字符串,因为我们希望将FirstName的长度限制为50个字符。
SELECT (firstName == null || firstName.Length <= 50) ? firstName : firstName.Substring(0, 50) AS FirstName
但是,我们收到了以下错误:
E_RUNTIME_USER_EXPRESSION_EVALUATION&gt; E_RUNTIME_USER_SUBSTRING_OUT_RANGE
当我们尝试使用自定义.NET代码执行子字符串时,我们没有得到异常。工作顺利完成。我们没有收到任何错误行。
public static string DoSubString(string firstName)
{
string subFirstName;
try
{
subFirstName = (firstName == null || firstName.Length <= 50) ? firstName : firstName.Substring(0, 50);
}
catch(ArgumentOutOfRangeException ae)
{
subFirstName = string.Format("Argument Out of range Error {0} {1}",firstName,ae.Message);
}
catch(Exception Ex)
{
subFirstName = string.Format("Generic Error {0} {1}",firstName, Ex.Message);
}
return subFirstName;
}
我们无法找到错误行。当我们查看Profile.xml时,我们没有得到行转储。
用户表达式的内部异常:\ n当前行 转储:“
如何查找导致此异常的错误行?如何排除这些问题?
答案 0 :(得分:2)
为了测试我使用了10个字符,修改为50。
@table =
SELECT * FROM
( VALUES
("appleJackss"),
("apple Jacks"),
("appleJacks"),
(" "),
(""),
((string)null)
) AS T(word);
@result =
SELECT //Method 1
CASE
WHEN word.Length <= 10 THEN word
ELSE word.Substring(0, 10)
END AS justTen,
// Method 2
(word.Length <= 10) ? word : word.Substring(0, 10) AS anotherTen
FROM @table;
OUTPUT @result
TO "/Temp/Example1.txt"
USING Outputters.Tsv();
答案 1 :(得分:2)
我们提出了产品组的问题。看来U-SQL中的子串操作存在一些问题。他们要求我们将以下修复应用于子串计算。我们尝试了它并且它正常工作。
SELECT (firstName == null || firstName.Length <= 50) ? firstName : firstName.Substring(0, Math.Min(firstName.Length, 50)) AS FirstName