长期读者,第一次海报。提前为文字墙道歉。
简短版本:我需要知道如何使用 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 语句。