这个想法是使用查找活动来选择表中提到的第一个月份和年份。
select MONTH(regtime) as FirstMonth , YEAR(RegTime) as Year from MyTable where ID = (select MIN(id) from MyTable)
然后,在复制活动中使用此查找的结果来选择此表中具有时间戳的行,这些行的时间戳与在查找活动中选择的月份和年份相同。这可以定义复制活动中的源,如下所示:
select * from MyTable where MONTH(RegTime) = '@{activity('LookupFirstMonth').output.firstRow.FirstMonth}' and YEAR(RegTime) = '@{activity('LookupFirstMonth').output.firstRow.Year}'
下一步应该是将行复制到数据湖。在复制活动的"接收器"区域中,可以动态地设置放入数据的文件的文件名。但是我找不到我想要的方法。我希望文件名反映在查找活动中选择的月份和年份。
我可以将接收器的文件名设置为@{activity('LookupFirstMonth').output.firstRow.MONTH}
,然后文件名将是月份编号。但这还不够。它还应该在文件名中包含 YEAR。当我将文件名指定为:
@CONCAT(@{activity('LookupFirstMonth').output.firstRow.FirstMonth}, @{activity('LookupFirstMonth').output.firstRow.Year}, '.txt')
我收到一个错误:
{"code":"BadRequest","message":"The expression 'CONCAT(@{activity('LookupFirstMonth').output.firstRow.FirstMonth}, @{activity('LookupFirstMonth').output.firstRow.Year}, '.txt')' is not valid: the string character '@' at position '7' is not expected."","target":"pipeline/pipeline1/runid/3cf0a5a9-01df-494e-bdaf-dfc66f406a83"}
那么如何在复制活动中接收器的文件名中使用查找活动的结果
正确的表达式应该是
@CONCAT(activity('LookupFirstMonth'(.output.firstRow.FirstMonth,activity('LookupFirstMonth'(.output.firstRow.Year, '.txt'(
或
@{CONCAT(activity('LookupFirstMonth'(.output.firstRow.FirstMonth,activity('LookupFirstMonth'(.output.firstRow.Year, '.txt'(}
第一个是纯表达式,而第二个是字符串插值(带 {}(
基本上,如果你以 @concat 开头表达式,concat 函数中的所有内容都不能以 @ 开头。 所以试试这个:
@CONCAT({activity('LookupFirstMonth').output.firstRow.FirstMonth}, {activity('LookupFirstMonth').output.firstRow.Year}, '.txt')
MSDN 文档中的示例:
"@concat('Answer is: ', string(pipeline().parameters.myNumber))"
所以你看,在 pipeline(( 之前没有 @。