【问题标题】:Need to convert SQL scalar-value function with PATINDEX to VB equivalent需要将带有 PATINDEX 的 SQL 标量值函数转换为 VB 等效函数
【发布时间】:2013-10-14 20:41:30
【问题描述】:

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

简短版:我需要知道如何使用 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 语句。

【问题讨论】:

    标签: vb.net tsql ssis patindex


    【解决方案1】:

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

    【讨论】:

    • 并不是说你不能用RegEx(或其他工具)做某事,只是VB没有内置函数。
    • 在这种情况下,使用 RegEx 而不是运行三个 Instr() 并在这种情况下进行比较,是否会更有效地处理大量行?
    • 正则表达式应该更快,但您可以同时创建并测试它们以查看哪个更快。顺便说一句,对于 RegEx,我喜欢使用这个网站 regexlib。我不太了解 RegEx,但这个网站有很多用户发布的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多