需要将带有PATINDEX的SQL标量值函数转换为VB等效函数

时间:2013-10-14 20:41:31

标签: vb.net tsql ssis patindex

长期读者,第一次海报。对不起,请提前填写文字墙。

简短版本:我需要知道如何使用VB的Instr(或其他一些VB函数)来搜索字符串并返回该字符串中三个符号中任意一个符号的第一次出现的索引。三个符号中的任何一个可以在字符串中以任何顺序出现任意次数。 在Tsql中,我将使用PATINDEX

搜索字符串
WHILE PATINDEX('%[#$@]%',@MyString) >0 

使用#,$和@作为我需要查找的各个符号。注意:这些是替换 - 使用的实际符号“IRL”在我的stackOverflow帖子中引起了问题。

长版: 我写了一个Tsql函数,它接受一个日期(一个保修开始日期),一个带有来自应用程序的符号和数字的特殊字符串,以及一些其他必要的输入,然后遍历“特殊字符串”并执行X个DATEADD操作,最终返回保修结束日期。问题是我需要这个日期报告数据库仓库并为每一行调用函数这样太慢了。我想将整个函数移动到SSIS包中的脚本任务中,该脚本任务首先加载数据,因此计算可以在内存中完成,只需要完成一次。以下是参考的TSQL函数:

            CREATE FUNCTION [dbo].[CalcLDCoverageExp]
            (   
                 @LDCoverage int
                ,@LDCoveragePeriod varchar(max)
                ,@GracePeriod varchar(max)
                ,@dt datetime
                ,@WarrEndt datetime
                )
            RETURNS datetime
            AS
            BEGIN
                Declare @code varchar(max), @symbol varchar(1),@val int
                IF @LDCoverage=1 
                --There is LD coverage
                    BEGIN   
                    IF LEN(rtrim(@LDCoveragePeriod))>0 
                    --There is a Specific LDCoverage period  on the Warrenty Agreement
                        BEGIN
                            SET @code=@LDCoveragePeriod+@GracePeriod    
                            WHILE PATINDEX('%[#$@]%',@code) >0 
                            BEGIN
                                SET @symbol=substring(@code,PATINDEX('%[#$@]%',@code),1)
                                SET @val= Left(@code,PATINDEX('%[#$@]%',@code)-1)
                                SET @dt = (Case @symbol When '#' Then DATEADD(YYYY,@val,@dt)
                                                When '$' Then DATEADD(M,@val,@dt)
                                                When '@' Then DATEADD(D,@val,@dt)
                                                END)
                                SET @code = RIGHT(@code,Len(@code)-PATINDEX('%[#$@]%', @code))
                                --STUFF(@code, PATINDEX('%[#$@]%', @code), 1, '') 
                            END
                        END
                    ELSE
                    --There is not a specific LDCoverage period on the Warrenty Agreement; LD=WarrentyEnd+1Day
                    SET @dt=Dateadd(d,1,@WarrEndt)
                    --END IF LEN(rtrim(@LDCoveragePeriod))>0
                    END
                ELSE
                --No LD Coverage
                SET @dt=NULL
                --END IF @LDCoverage=1 
            RETURN @dt
            END

我已经掌握了VB.net的知识,我确信只需要一点点努力和大量搜索stackoverflow,我就可以将其余的TSQL函数转换为VB equlivalent。但我仍然坚持如何重写PATINDEX语句。

1 个答案:

答案 0 :(得分:0)

VB没有标准函数来获取“该字符串中三个符号中任何一个符号的首次出现”的索引。您将不得不创建一些将运行instr()(或使用新的.Net版本String.IndexOf)3次以获得最低数字的东西。不应该太难做。