长期读者,第一次海报。对不起,请提前填写文字墙。
简短版本:我需要知道如何使用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语句。
答案 0 :(得分:0)
VB没有标准函数来获取“该字符串中三个符号中任何一个符号的首次出现”的索引。您将不得不创建一些将运行instr()(或使用新的.Net版本String.IndexOf
)3次以获得最低数字的东西。不应该太难做。