"name": "@pipeline().parameters.password"
表达式可出现在 JSON 字符串值中的任何位置,始终生成另一个 JSON 值。 如果某个 JSON 值为表达式,会通过删除 @ 符号来提取表达式的正文。 如果需要以“@”开头的文本字符串,则必须使用 @@ 将它转义。 以下示例演示了如何计算表达式。
JSON 值
如果使用称为字符串内插的功能(其中表达式封装在 @{ ... } 内),表达式还可以显示在字符串内。 例如: "name" : "First Name: @{pipeline().parameters.firstName} Last Name: @{pipeline().parameters.lastName}"
使用字符串内插,结果始终是字符串。 假设我将 myNumber 定义为 42,将 myString 定义为 foo:
JSON 值
在 ForEach 活动之类的控制流活动中,可以提供要针对属性项进行迭代的数组,并使用 @item() 在 ForEach 活动中对单个枚举进行迭代。 例如,如果 items 是数组:[1, 2, 3],则 @item() 在第一次迭代中返回 1,在第二次迭代中返回 2,在第三次迭代中返回 3。 你还可以使用 @range(0,10) 之类的表达式,从 0 开始,到 9 结束,迭代 10 次。
可以使用 @activity('活动名称') 来捕获活动的输出并做出决策。 请考虑名为“Web1”的 Web 活动。 若要将第一个活动的输出放在第二个活动的正文中,表达式通常如下所示:@activity('Web1').output 或 @activity('Web1').output.data,或类似的内容,具体取决于第一个活动的输出的内容。
复杂表达式示例
以下示例显示了一个复杂的示例,该示例引用了活动输出的一个深层子字段。 若要引用计算结果为子字段的管道参数,请使用 [] 语法而不是点 (.) 运算符(如 subfield1 和 subfield2 一样),作为某个活动输出的组成部分。
@activity('*activityName*').output.*subfield1*.*subfield2*[pipeline().parameters.*subfield3*].*subfield4*
动态创建文件并命名是一种常见模式。 让我们来探究几个动态文件命名示例。
将日期追加到文件名:@concat('Test_', formatDateTime(utcnow(), 'yyyy-dd-MM'))
按照客户时区追加日期时间:@concat('Test_', convertFromUtc(utcnow(), 'Pacific Standard Time'))
追加触发器时间: @concat('Test_', pipeline().TriggerTime)
输出到带有日期的单个文件时,在映射数据流中输出自定义文件名:'Test_' + toString(currentDate()) + '.csv'
在上述情况下,会创建 4 个以 Test_ 开头的动态文件名。
动态内容编辑器
完成编辑后,动态内容编辑器会自动转义内容中的字符。 例如,内容编辑器中的以下内容是具有两个表达式函数的字符串内插。
"type": "@{if(equals(1, 2), 'Blob', 'Table' )}",
"name": "@{toUpper('myData')}"
动态内容编辑器将上述内容转换为表达式 "{ \n \"type\": \"@{if(equals(1, 2), 'Blob', 'Table' )}\",\n \"name\": \"@{toUpper('myData')}\"\n}"。 此表达式的结果为下面所示的 JSON 格式字符串。
"type": "Table",
"name": "MYDATA"
使用参数的数据集
在以下示例中,BlobDataset 采用名为 path 的参数。 其值用于使用以下表达式设置 folderPath 属性的值:dataset().path。
"name": "BlobDataset",
"properties": {
"type": "AzureBlob",
"typeProperties": {
"folderPath": "@dataset().path"
"linkedServiceName": {
"referenceName": "AzureStorageLinkedService",
"type": "LinkedServiceReference"
"parameters": {
"path": {
"type": "String"
使用参数的管道
在以下示例中,管道采用 inputPath 和 outputPath 参数。 参数化 blob 数据集的路径使用这些参数的值进行设置。 此处使用的语法是:pipeline().parameters.parametername。
"name": "Adfv2QuickStartPipeline",
"properties": {
"activities": [
"name": "CopyFromBlobToBlob",
"type": "Copy",
"inputs": [
"referenceName": "BlobDataset",
"parameters": {
"path": "@pipeline().parameters.inputPath"
"type": "DatasetReference"
"outputs": [
"referenceName": "BlobDataset",
"parameters": {
"path": "@pipeline().parameters.outputPath"
"type": "DatasetReference"
"typeProperties": {
"source": {
"type": "BlobSource"
"sink": {
"type": "BlobSink"
"parameters": {
"inputPath": {
"type": "String"
"outputPath": {
"type": "String"
替换特殊字符
完成编辑后,动态内容编辑器会自动转义内容中的双引号、反斜杠等字符。 如果要在 replace() 函数中使用 \n、\t 替换换行符或制表符,这会导致问题 。 可以在代码视图中编辑动态内容,以删除表达式中多余的 \,也可以按照以下步骤使用表达式语言替换特殊字符:
针对原始字符串值的 URL 编码
替换 URL 编码的字符串,例如换行符 (%0A)、回车符 (%0D)、水平制表符 (%09)。
URL 解码
例如,变量 companyName 的值带有换行符,表达式 @uriComponentToString(replace(uriComponent(variables('companyName')), '%0A', '')) 可以删除换行符。
Contoso-
Corporation
转义单引号字符
管道中的表达式函数使用单引号 (') 来环绕字符串值参数。 在管道字符串表达式中使用两个连续单引号字符来添加单引号。 下面是一个示例:表达式 @concat('Here is a double quote character: ". ', 'And here is a single quote character all within the same string: ''.') 将返回以下结果:
Here is a double quote character: ". And here is a single quote character all within the same string: '.
但是,在数据流表达式中,不支持此语法。 相反,数据流表达式可以用单引号或双引号括起来。 在字符串函数中,将需要单引号的文本括在双引号内,将需要双引号的文本括在单引号中。 如果需要同时包含单引号和双引号的字符串,可以使用 concat() 合并两个子字符串(两个字符串分别包含单引号和双引号)。 与上面的管道表达式示例等效的数据流为 concat('Here is a double quote character: ". ', "And here is a single quote character all within the same string: '.")。 在数据流中,该表达式将返回与前面的管道表达式示例相同的结果。
Tutorial
本教程逐步讲解如何在管道和活动之间以及活动之间传递参数。 本教程针对专门 Azure 数据工厂演示了步骤,尽管 Synapse 工作区的步骤几乎相同,但用户界面略有不同。
可以在表达式中调用函数。 以下各节提供了有关可以在表达式中使用的函数的信息。
日期或时间函数
addToTime('2018-01-01T00:00:00Z', 1, 'Day', 'D')
并使用可选的“D”格式返回结果:"Tuesday, January 2, 2018"
检查两个表达式是否均为 true。
当两个表达式均为 true 时返回 true,当至少一个表达式为 false 时返回 false。
and(<expression1>, <expression2>)
第一个示例:两个表达式均为 true,因此返回 true。
第二个示例:一个表达式为 false,因此返回 false。
第三个示例:两个表达式均为 false,因此返回 false。
这些示例检查指定的表达式是否均为 true:
and(equals(1, 1), equals(2, 2))
and(equals(1, 1), equals(1, 2))
and(equals(1, 2), equals(1, 3))
并返回以下结果:
第一个示例:两个表达式均为 true,因此返回 true。
第二个示例:一个表达式为 false,因此返回 false。
第三个示例:两个表达式均为 false,因此返回 false。
array
从单个指定的输入返回数组。
对于多个输入,请参阅 createArray()。
array('<value>')
返回 base64 编码字符串的字符串版本,有效地对 base64 字符串进行解码。
请使用此函数而非 decodeBase64()。
虽然这两个函数的工作方式相同,但首选 base64ToString()。
base64ToString('<value>')
这些示例返回指定值中的第一个非 null 值,当所有值均为 null 时返回 null:
coalesce(null, true, false)
coalesce(null, 'hello', 'world')
coalesce(null, null, null)
并返回以下结果:
第一个示例:true
第二个示例:"hello"
第三个示例:null
concat
组合两个或更多字符串,并返回组合后的字符串。
concat('<text1>', '<text2>', ...)
此示例将时间戳转换为指定的时区:
convertFromUtc('2018-01-01T08:00:00.0000000Z', 'Pacific Standard Time')
并返回以下结果:"2018-01-01T00:00:00Z"
此示例将时间戳转换为指定的时区和格式:
convertFromUtc('2018-01-01T08:00:00.0000000Z', 'Pacific Standard Time', 'D')
并返回以下结果:"Monday, January 1, 2018"
convertTimeZone
将时间戳从源时区转换为目标时区。
convertTimeZone('<timestamp>', '<sourceTimeZone>', '<destinationTimeZone>', '<format>'?)
此示例将源时区转换为目标时区:
convertTimeZone('2018-01-01T08:00:00.0000000Z', 'UTC', 'Pacific Standard Time')
并返回以下结果:"2018-01-01T00:00:00.0000000"
此示例将时区转换为指定的时区和格式:
convertTimeZone('2018-01-01T08:00:00.0000000Z', 'UTC', 'Pacific Standard Time', 'D')
并返回以下结果:"Monday, January 1, 2018"
convertToUtc
将时间戳从源时区转换为协调世界时 (UTC)。
convertToUtc('<timestamp>', '<sourceTimeZone>', '<format>'?)
convertToUtc('01/01/2018 00:00:00', 'Pacific Standard Time')
并返回以下结果:"2018-01-01T08:00:00.0000000Z"
此示例将时间戳转换为 UTC:
convertToUtc('01/01/2018 00:00:00', 'Pacific Standard Time', 'D')
并返回以下结果:"Monday, January 1, 2018"
createArray
从多个输入返回数组。
对于单输入数组,请参阅 array()。
createArray('<object1>', '<object2>', ...)
并返回以下结果:
"01100100011000010111010001100001001110100111010001100101011110000111010000101111011100000 1101100011000010110100101101110001110110110001101101000011000010111001001110011011001010111 0100001111010111010101110100011001100010110100111000001110110110001001100001011100110110010 10011011000110100001011000110000101000111010101100111001101100010010001110011100000111101"
dataUriToString
返回数据统一资源标识符 (URI) 的字符串版本。
dataUriToString('<value>')
decodeBase64
返回 base64 编码字符串的字符串版本,有效地对 base64 字符串进行解码。
请考虑使用 base64ToString() 而非 decodeBase64()。
虽然这两个函数的工作方式相同,但首选 base64ToString()。
decodeBase64('<value>')
返回数据统一资源标识符 (URI) 的二进制版本。
请考虑使用 dataUriToBinary() 而非 decodeDataUri()。
虽然这两个函数的工作方式相同,但首选 dataUriToBinary()。
decodeDataUri('<value>')
并返回以下结果:
"01100100011000010111010001100001001110100111010001100101011110000111010000101111011100000 1101100011000010110100101101110001110110110001101101000011000010111001001110011011001010111 0100001111010111010101110100011001100010110100111000001110110110001001100001011100110110010 10011011000110100001011000110000101000111010101100111001101100010010001110011100000111101"
decodeUriComponent
返回一个字符串,并将其中的转义字符替换为解码后的版本。
decodeUriComponent('<value>')
encodeUriComponent
通过将 URL 不安全字符替换为转义字符来返回字符串的统一资源标识符 (URI) 编码版本。
请考虑使用 uriComponent() 而非 encodeUriComponent()。
虽然这两个函数的工作方式相同,但首选 uriComponent()。
encodeUriComponent('<value>')
formatDateTime('03/15/2018 12:00:00', 'yyyy-MM-ddTHH:mm:ss')
并返回以下结果:"2018-03-15T12:00:00"
getFutureTime
返回当前时间戳加上指定的时间单位。
getFutureTime(<interval>, <timeUnit>, <format>?)
假设当前时间戳是“2018-03-01T00:00:00.0000000Z”。
此示例加上 5 天,并将结果转换为“D”格式:
getFutureTime(5, 'Day', 'D')
并返回以下结果:"Tuesday, March 6, 2018"
getPastTime
返回当前时间戳减去指定的时间单位。
getPastTime(<interval>, <timeUnit>, <format>?)
检查第一个值是否大于或等于第二个值。
当第一个值大于或等于第二个值时返回 true,当第一个值小于第二个值时返回 false。
greaterOrEquals(<value>, <compareTo>)
greaterOrEquals('<value>', '<compareTo>')
此示例将以下 XML 转换为 JSON:
json(xml('<?xml version="1.0"?> <root> <person id='1'> <name>Sophia Owen</name> <occupation>Engineer</occupation> </person> </root>'))
并返回以下结果:
"?xml": { "@version": "1.0" },
"root": {
"person": [ {
"@id": "1",
"name": "Sophia Owen",
"occupation": "Engineer"
intersection
返回其中仅包含指定集合的共有项的一个集合。
某个项必须出现在传递给此函数的所有集合中才会出现在结果中。
如果一个或多个项具有相同的名称,则具有该名称的最后一项将出现在结果中。
intersection([<collection1>], [<collection2>], ...)
intersection('<collection1>', '<collection2>', ...)
此示例查找以下数组中的共有项:
intersection(createArray(1, 2, 3), createArray(101, 2, 1, 10), createArray(6, 8, 1, 2))
并返回“仅”包含这些项的数组:[1, 2]
返回一个字符串,它包含某个数组中的所有项并且以分隔符分隔每个字符。
join([<collection>], '<delimiter>')
检查第一个值是否小于或等于第二个值。
当第一个值小于或等于第二个值时返回 true,当第一个值大时返回 false。
lessOrEquals(<value>, <compareTo>)
lessOrEquals('<value>', '<compareTo>')
此示例查找“the old string”中的“old”子字符串并将“old”替换为“new”:
replace('the old string', 'old', 'new')
并返回以下结果:"the new string"
删除集合开头的项,并返回所有其他项。
skip([<collection>], <count>)
subtractFromTime('2018-01-02T00:00:00Z', 1, 'Day')
并返回以下结果:"2018-01-01T00:00:00:0000000Z"
此示例从以下时间戳中减去 1 天:
subtractFromTime('2018-01-02T00:00:00Z', 1, 'Day', 'D')
并使用可选的“D”格式返回以下结果:"Monday, January, 1, 2018"
返回集合开头的项。
take('<collection>', <count>)
take([<collection>], <count>)
union
返回一个集合,其中包含指定集合中的所有项。
某个项只要出现在传递给此函数的任一集合中便会出现在结果中。 如果一个或多个项具有相同的名称,则具有该名称的最后一项将出现在结果中。
union('<collection1>', '<collection2>', ...)
union([<collection1>], [<collection2>], ...)
uriComponent
通过将 URL 不安全字符替换为转义字符来返回字符串的统一资源标识符 (URI) 编码版本。
请使用此函数而非 encodeUriComponent()。
虽然这两个函数的工作方式相同,但首选 uriComponent()。
uriComponent('<value>')
并返回以下结果:
"001000100110100001110100011101000111000000100101001100 11010000010010010100110010010001100010010100110010010001 10011000110110111101101110011101000110111101110011011011 110010111001100011011011110110110100100010"
uriComponentToString
返回统一资源标识符 (URI) 编码字符串的字符串版本,有效地对 URI 编码字符串进行解码。
uriComponentToString('<value>')
此示例创建包含以下 JSON 对象的字符串的 XML:
xml(json('{\"person\": {\"name\": \"Sophia Owen\", \"city\": \"Seattle\"}}'))
并返回以下结果 XML:
<person>
<name>Sophia Owen</name>
<city>Seattle</city>
<person>
xpath
检查 XML 中是否存在与 XPath(XML 路径语言)表达式匹配的节点或值,并返回匹配的节点或值。 XPath 表达式或单纯的“XPath”有助于在 XML 文档结构中导航,以便可以在 XML 内容中选择节点或计算值。
xpath('<xml>', '<xpath>')
在示例 1 的基础上,此示例查找与 <count></count> 节点匹配的节点并通过 sum() 函数添加这些节点值:
xpath(xml(parameters('items')), 'sum(/produce/item/count)')
并返回以下结果:30
对于此示例,两个表达式都查找与指定参数(其中通过命名空间包括了 XML)中的 <location></location> 节点匹配的节点。 表达式使用反斜杠字符 (\) 作为双引号 (") 的转义字符。
表达式 1
xpath(xml(body('Http')), '/*[name()=\"file\"]/*[name()=\"location\"]')
表达式 2
xpath(xml(body('Http')), '/*[local-name()=\"file\" and namespace-uri()=\"http://contoso.com\"]/*[local-name()=\"location\"]')
下面是参数:
以下 XML,其中包括 XML 文档命名空间 xmlns="http://contoso.com":
<?xml version="1.0"?> <file xmlns="http://contoso.com"> <location>Paris</location> </file>
以下任一 XPath 表达式:
/*[name()=\"file\"]/*[name()=\"location\"]
/*[local-name()=\"file\" and namespace-uri()=\"http://contoso.com\"]/*[local-name()=\"location\"]
在示例 3 的基础上,此示例在 <location></location> 节点中查找值:
xpath(xml(body('Http')), 'string(/*[name()=\"file\"]/*[name()=\"location\"])')
并返回以下结果:"Paris"
可以将注释添加到数据流表达式,但不能将注释添加到管道表达式。
对于可以在表达式中使用的系统变量列表,请参阅系统变量。