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

Posted

技术标签:

【中文标题】如何在 SELECT 或 UPDATE 语句中使用 T-SQL UDF?【英文标题】:How to use a T-SQL UDF in a SELECT or UPDATE statement? 【发布时间】:2013-02-14 13:36:56 【问题描述】:

上下文: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 的新手。我没有看到什么明显的东西?

【问题讨论】:

什么是推荐人内容? 你能澄清一下“没有回应”吗?您是否收到错误或返回的数据不正确? 您的函数不适用于SELECT dbo.StrBetween('http://bbc.co.uk/default.html','//', '/') 尝试使用您的实际数据进行测试。 请不要进行这样的编辑。您更改了您的问题,使得该错误不再出现(然后,似乎归咎于您的更新中的 corrected 行)。简而言之,它使您的问题读起来像一派胡言,对任何未来的读者都无济于事。 公平评论,@Damien_The_Unbeliever。我会解开的。 【参考方案1】:

调用不是问题 - 这是逻辑问题,而且您的 @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 个字符。所以不要费心计算新的长度。

【讨论】:

以上是关于如何在 SELECT 或 UPDATE 语句中使用 T-SQL UDF?的主要内容,如果未能解决你的问题,请参考以下文章

无效的SQL语句;预期的DELETE,INSERT,PROCEDURE,SELECT或UPDATE?

在db2数据库9.7中,有时候执行一条update或select语句,要耗时很久,几个小

无效的 SQL语句;期待 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、或 'UPDATE

SQL:with 查询

如何获取 SQL Server 中 INSERT、UPDATE、DELETE、SELECT 语句的速率?

MS T-SQL UPDATE语句