長年の読者、初めてのポスター。テキストの壁については事前に申し訳ありません。
短いバージョン: VB の Instr (または他の VB 関数) を使用して文字列を検索し、その文字列内の 3 つのシンボルのいずれかが最初に出現したインデックスを返す方法を知る必要があります。3 つの記号のいずれかが、文字列内で任意の回数、任意の順序で出現する可能性があります。Tsql では、PATINDEX を使用して文字列を検索します。
WHILE PATINDEX('%[#$@]%',@MyString) >0
#、$、および @ は、探す必要がある個々の記号です。注: これらは置換です。「IRL」を使用する実際のシンボルは、私の stackOverflow 投稿で問題を引き起こしています。
詳細バージョン: 日付 (保証開始日)、アプリケーションからの記号と数字を含む特別な文字列、およびその他のいくつかの必要な入力を受け取り、「特別な文字列」をループして X 番号を実行する Tsql 関数を作成しました。最終的に保証終了日を返します。問題は、DB ウェアハウスから報告するためにこの日付が必要であり、このようにすべての行に対して関数を呼び出すのが遅すぎることです。関数全体を、最初にデータを読み込む 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 ステートメントを書き直す方法に行き詰まっています。