从sql存储过程中的逗号分隔的字符串中删除一个值

时间:2018-08-06 12:10:38

标签: sql-server stored-procedures

我有一个字段,用于存储出版物的逗号分隔ID。例如123456、2345678、123567、2345890等。当我从数据库中提取数据时,我将其放入json对象中,然后网页将循环这些值并显示数据。效果很好。

我想做的是向存储的proc发送一个数字,存储的proc将其从字符串中删除并将其保存回表中。例如最终用户使用出版物123567,现在想完成它,因此我想将其从字符串中删除,这样他们以后就看不到它了。我的数据库中有一个split函数,但是我不知道如何连接它以删除或重建没有发布ID的字符串。

我没有任何要显示的代码,因为我无所适从。我认为我需要传递整个字符串和ID。拆分字符串并循环每个值以重建一个新字符串,但请检查ID是否存在并跳过它。

这是最好的方法吗?

感谢您的帮助

作为工作的基础,我最终得到的是:

ALTER FUNCTION dbo.RemovePMID (
    @S VARCHAR(MAX)
    ,@PMID VARCHAR(15)
    )
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @T VARCHAR(50)
    DECLARE @W VARCHAR(50)

    SET @T = ''

    WHILE len(@S) > 0
    BEGIN
        SET @W = left(@S, charindex(',', @S + ',') - 1)

        IF charindex(@W, + @PMID) = 0
            SET @T = @T + ',' + @W
        SET @S = stuff(@S, 1, charindex(',', @S + ','), '')
    END

    RETURN substring(@T, 2, len(@T) - 2)
END
GO

1 个答案:

答案 0 :(得分:3)

不需要循环(请看一看Larnu对您的解析/拆分函数的建议)

话虽如此,请考虑以下内容

示例

Declare @S varchar(max) = '123456,2345678,123567,2345890'

Declare @Zap varchar(50)='123456'

Select reverse(stuff(reverse(stuff(replace(','+@S+',',','+@Zap+',',','),1,1,'')),1,1,''))

返回

2345678,123567,2345890