0

长期读者,第一次海报。提前为文字墙道歉。

简短版本:我需要知道如何使用 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 等效函数。但我坚持如何重写该 PATINDEX 语句。

4

1 回答 1

0

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

于 2013-10-14T21:04:06.837 回答