1

コンテキスト: SQL Server 2000

他の 2 つのテキスト間のテキストを提供する UDF を作成しました。

CREATE FUNCTION dbo.StrBetween 
(
    @Text nvarchar(4000),
    @Lhs nvarchar(4000),
    @Rhs nvarchar(4000)
)
RETURNS nvarchar(4000)
AS
BEGIN
    DECLARE @LhsOffset INT;
    DECLARE @RhsOffset INT;
    DECLARE @Result NVARCHAR(4000);

    SET @LhsOffset = CHARINDEX( @Lhs, @Text );
    IF @LhsOffset = 0 
    BEGIN
        RETURN @Text;
    END
    SET @Result = SUBSTRING( @Text, @LhsOffset+1, LEN(@Text)-LEN(@Lhs));
    SET @RhsOffset = CHARINDEX( @Rhs, @Result );
    IF @RhsOffset = 0 
    BEGIN
        RETURN @Result;
    END
    SET @Result = SUBSTRING( @Result, 1, @RhsOffset - 1 );
    RETURN @Result;
END

これは、たとえば、

SELECT dbo.StrBetween('dog','d','g')

ただし、最初の引数の値として列を渡すと、応答がありません。例えば、

SELECT [TEST].[dbo].StrBetween(Referrer,'//', '/') as tst FROM tblTest 

リファラーは nvarchar フィールドとして宣言されます。T-SQLに関しては初心者です。私が見ていない明らかなことは何ですか?

4

1 に答える 1

3

これは呼び出しの問題ではなく、ロジックの問題であり、@Rhs値が値の一部であるという事実@Lhsです。

SET @Result = SUBSTRING( @Text, @LhsOffset+1, LEN(@Text)-LEN(@Lhs));

これは、文字列の最初の文字を削除してい@Lhsます。ただし、2 番目の文字は/であり、それ@Rhsが一致の検索対象であるため、すぐに位置 1 で検出され、空の文字列が取得されます。

代わりに、次を試してください。

SET @Result = SUBSTRING( @Text, @LhsOffset+LEN(@Lhs), 4000);

長さを正確に計算する必要はありません。4000 文字を要求し、文字列の長さが 12 文字しかないSUBSTRING場合、最大 12 文字が返されます。したがって、新しい長さを計算する必要はありません。

于 2013-02-14T13:41:53.783 に答える