如何在SELECT或UPDATE语句中使用T-SQL UDF?

时间:2013-02-14 13:36:57

标签: tsql sql-server-2000 user-defined-functions

上下文:SQL Server 2000

我写了一个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

如果我有,那么这在SQL查询分析器中可以正常工作

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

但是,当我将列作为第一个参数的值传递时,我没有得到任何响应。例如,

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

Referrer被声明为nvarchar字段。谈到T-SQL,我是新手。我没看到什么明显的事情?

1 个答案:

答案 0 :(得分:3)

调用不是问题 - 这是一个逻辑问题,而且@Rhs值是@Lhs值的一部分。

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

这是删除@Lhs字符串的第一个字符。但是,由于第二个字符为/,这就是您的@Rhs匹配所搜索的内容,它会立即在位置1找到它,因此您会得到一个空字符串。

相反,请尝试:

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

您不必精确计算长度。如果您要求4000个字符且字符串长度仅为12个字符,SUBSTRING将返回最多12个字符。所以不要费心计算新的长度。