将Perl脚本转换为T-SQL

时间:2016-11-13 03:12:31

标签: sql perl tsql ssis

好的 - 我需要Perl Guru的帮助。一位同事为我提供了他们支持的Perl应用程序的代码,以及它在将数据写入Oracle之前如何对值进行编码。不要问我为什么他们这样编码(似乎是特殊字符)。这些值正被写入Oracle中的CLOB。我需要一个等效的解码用于SQL Server中的SSIS包。

基本上我是使用SSIS包从Oracle数据库中读取数据,需要解码这些值。单词之间的“+”符号很容易用替换语句(不确定这是最好的方法,但到目前为止似乎有效)。

这个超出了我的技能范围,因为我的Perl脚本技能有限(是的,我已经做了一些阅读,但结果并不像我想的那么容易,因为我不太了解Perl)。我只对解码不编码的字符串感兴趣。

BTW作为一个提示,我知道%29等于“)”符号。看起来正在使用正则表达式,但我也不太熟悉使用它(我知道我需要学习它)。

sub decodeValue($)
    {
        my $varRef = shift;

        ${$varRef} =~  tr/+/ /;
        ${$varRef} =~ s/%([a-fA-F0-9]{2})/pack("C",hex($1))/eg;
        ${$varRef} =~ tr/\cM//;
        ${$varRef} =~ s/"/\"/g;
        return;
    }


sub encodeValue($)
    {
        my $varRef = shift;

        # ${$varRef} =~  tr/ /+/;
        ${$varRef} =~  s/"/\"/g;
        ${$varRef} =~  s/'/\'/g;
        ${$varRef} =~  s/(\W)/sprintf( "%%%x", ord($1) )/eg;
        return;
    }

1 个答案:

答案 0 :(得分:2)

encodeValue子例程是一种简单的URL编码算法,还有将单引号和双引号转换为等效HTML实体的附加步骤。您需要编写Transact-SQL代码以反向顺序解码这些步骤,因此首先必须将所有%7f - 类型序列替换为其等效字符

您应该查看URL Decode in T-SQL代码来执行此操作。它支持完整的UTF-8字符集。如果您愿意,可以删除所有ELSE IF @Byte1Value块以仅支持7位ASCII,但它可以正常工作

使用REPLACE调用可以撤消单引号和双引号以及空格的剩余转换,我相信您不需要帮助。原始decodeValue子例程仅恢复双引号和空格,将单引号保留为',因此我不知道您是否要复制该行为