试用 Microsoft Fabric 中的数据工厂 ,这是一种适用于企业的一站式分析解决方案。 Microsoft Fabric 涵盖从数据移动到数据科学、实时分析、商业智能和报告的所有内容。 了解如何免费 开始新的试用

本文提供了有关 Azure 数据工厂和 Azure Synapse Analytics 支持的表达式和函数的详细信息。

定义中的 JSON 值可以是文字,也可以是运行时计算的表达式。 例如:

"name": "value"
"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"

    使用参数的管道

    在以下示例中,管道采用 inputPathoutputPath 参数。 参数化 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"

    可以将注释添加到数据流表达式,但不能将注释添加到管道表达式。

    对于可以在表达式中使用的系统变量列表,请参阅系统变量

  •