使用UDF根据字符串

时间:2015-08-17 06:40:21

标签: sql variables udf

我在sql中有一个表,其中有一个名为[message]的列。我需要使用UDF来填充1或0依赖于该子字符串是否包含' LHL'。

我的代码:

    create function dbo.generate 
    (
    @result varchar(max)
    )
    returns int
    as
    begin
    declare @message varchar(max) = (Select [message] from POST)
    if (PATINDEX('%LHL%', @message) > 0)
    begin
    set @result = '1'
    end
    else 
    set @result = '0'
    return @result
    end
    go

    select dbo.generate('%LHL%')

有了这个,我得到了错误:

Msg 512,Level 16,State 1,Line 1 子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我只需要一个包含0&1和1的列表。我可以使用PATINDEX生成一个列表,它可以给我LHL开始的位置,但似乎无法将数字更改为1(如果存在),如图所示。 (也必须使用UDF而不是CTE)

    with cte as
    (select [message] from POSt
    ), 
    pos as
    (select patindex('%LHL%',[message]) pos, [message] from cte
    union all
    select pos+patindex('%LHL%',substring([message], pos+1, len([message]))) pos, [message] from pos
    where patindex('%LHL%',substring([message], pos+1, len([message])))>0
    )
    select pos from pos

2 个答案:

答案 0 :(得分:2)

为什么不使用EXISTS子句来检查是否存在行?

IF(EXISTS(Select [message] from POST WHERE [message] LIKE '%LHL%'))
BEGIN
    SET @result = '1'
END
ELSE
BEGIN
    SET @result = '0'
END

    RETURN @result

根据您想要达到的目标(即检查是否存在LHL),这是最佳选择。但是,如果您希望所有位置通过将其作为字符串首先将整个列数据转换为字符串然后进行搜索。

答案 1 :(得分:1)

用于设置变量@message值的SELECT语句declare @message varchar(max) = (Select [message] from POST)返回多个值。限制SELECT语句一次只返回一个值,以便它可以存储在' @ message'变量

相关问题