SSIS变量表达式修剪

时间:2015-10-14 19:36:30

标签: ssis expression trim

我将此字符串传递给名为token的变量。

  

{ “reportStatusToken”: “NjVmjYWIwODI0MTVhOzMyNzQ7MTQ0NDg0MjQxMTYxNA ==”}

但是我一直在尝试使用SSIS中的表达式构建器来修剪该字符串以获得令牌(请参阅下一个块以获得最终结果)。但我不能让它正确出来。也许我使用了错误的字符串函数。我用过Trim并替换了。两者都不正常。

  

NjVmjYWIwODI0MTVhOzMyNzQ7MTQ0NDg0MjQxMTYxNA ==

之后将其保存回变量,以便我可以使用此令牌在其他包上调用它。这是包级别范围,数据类型字符串。任何帮助都会有所帮助。

1 个答案:

答案 0 :(得分:1)

在这样的情况下,我发现反转字符串会让事情变得更容易。

{"reportStatusToken":"NjVmjYWIwODI0MTVhOzMyNzQ7MTQ0NDg0MjQxMTYxNA=="}
         1         2         3         4         5         6         7
1234567890123456789012345678901234567890123456789012345678901234567890

}"==ANxYTMxQjM0gDN0QTM7QzNyMzOhVTM0IDOwIWYjmVjN":"nekoTsutatStroper"{

如果字符串被反转,FINDSTRING的值为1将找到第一个(最后一个)引用{position 2}。然后,我们需要使用该位置来帮助我们找到下一个位置{位置48}。我创建两个Int32类型的SSIS变量并使用以下公式

PositionUltimateQuoteReverse := FINDSTRING(REVERSE(@[User::token]), "\"", 1)
PositionPenultimateQuoteReverse := FINDSTRING(REVERSE(@[User::token]), "\"", @[User::PositionUltimateQuoteReverse])-1

当我在它时,我将使用这两个值来确定两个引号之间有多少个字符。我在这里减去2,因为上面的位置包括引号本身所以从每一端拿一个。

tokenLength := @[User::PositionPenultimateQuoteReverse] - @[User::PositionUltimateQuoteReverse] -2

我们需要的最终计算是确定 where 以开始切片和切块。我们只是做数学加一,找到倒数第二个双引号的位置。

tokenStartPosition := LEN(@[User::token]) - @[User::PositionPenultimateQuoteReverse] +1

最后,我们使用所有这些中间计算来查找最终标记

SUBSTRING(@[User::token], @[User::tokenStartPosition], @[User::tokenLength])

BIML

商业智能标记语言biml使我们能够将一种XML方言翻译成SSIS包。只需下载BIDS Helper并安装即可。右键单击SSIS项目,然后选择Add new biml file。双击BimlScript.biml并使用以下内容替换内容。完成后,右键单击并选择生成新的SSIS包。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
        <Package Name="so_33134095">
            <Variables>
                <Variable DataType="String" Name="token">{"reportStatusToken":"NjVmjYWIwODI0MTVhOzMyNzQ7MTQ0NDg0MjQxMTYxNA=="}</Variable>
                <Variable 
                    DataType="Int32" 
                    Name="PositionUltimateQuoteReverse" 
                    EvaluateAsExpression="true"><![CDATA[FINDSTRING(REVERSE(@[User::token]), "\"", 1) ]]></Variable>
                <Variable
                    DataType="Int32"
                    Name="PositionPenultimateQuoteReverse"
                    EvaluateAsExpression="true"><![CDATA[FINDSTRING(REVERSE(@[User::token]), "\"", @[User::PositionUltimateQuoteReverse])-1]]></Variable>

                <Variable
                    DataType="Int32"
                    Name="tokenLength"
                    EvaluateAsExpression="true">@[User::PositionPenultimateQuoteReverse] - @[User::PositionUltimateQuoteReverse] -2</Variable>

                <Variable
                    DataType="Int32"
                    Name="tokenStartPosition"
                    EvaluateAsExpression="true">LEN(@[User::token]) - @[User::PositionPenultimateQuoteReverse] +1</Variable>

                <Variable 
                    DataType="String" 
                    Name="justToken" 
                    EvaluateAsExpression="true">SUBSTRING(@[User::token], @[User::tokenStartPosition], @[User::tokenLength]) </Variable>

            </Variables>
        </Package>
    </Packages>
</Biml>