首页 > 解决方案 > 从 sql 存储过程中的逗号分隔字符串中删除一个值

问题描述

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

我想做的是将存储过程中的一个数字发送给存储过程,存储过程会将其从字符串中删除并将其保存回表中。例如最终用户在出版物 123567 上工作,现在想要完成它,所以我想将它从字符串中删除,这样他们以后就看不到它了。我在数据库中有一个拆分功能,但我不知道如何连接它以删除或重建没有发布 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

标签: sql-serverstored-procedures

解决方案


不需要循环(请看一下 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

推荐阅读