0

我目前有这个 SQL 存储过程:

    DECLARE @old nvarchar(MAX)
    SELECT @old = ReadPostIds FROM CrmUserDetails  WHERE MemberNumber = @memNum

     UPDATE CrmUserDetails SET ReadPostIds = CONVERT(NVARCHAR(MAX),REPLACE(@old,CONVERT(NVARCHAR(50), @postId), '') + CONVERT(NVARCHAR(50), @postId) + ',' )
     WHERE MemberNumber = @memNum

而不是 1,2,3 等,我想为每个逗号分隔的元素和另一个数字添加一个管道,如 1|2,3|4,5|6 等。

问题是我不知道第二个数字是多少。所以我在哪里这样做:

 CONVERT(NVARCHAR(MAX),REPLACE(@old,CONVERT(NVARCHAR(50), @postId), '')

我想这样做:

 CONVERT(NVARCHAR(MAX),REPLACE(@old,CONVERT(NVARCHAR(50), @postId) + * + '|', '')

其中 * 是任何东西。我知道解决方案将与 PATINDEX() 有关,但我的截止日期是昨天,我已经工作了 16 个小时,并且在 SQL 方面很糟糕。

任何帮助都会很棒。

谢谢,

4

2 回答 2

0

以此为例:

DECLARE @old nvarchar(MAX), @pattern nvarchar(20), @replace nvarchar(20)
SELECT @old = ReadPostIds FROM CrmUserDetails  WHERE MemberNumber = @memNum

SET @pattern = L'%2|_%' -- Note how the pattern must be declared, the actual searched string in the pattern is 2|*, as per your example
SET @replace = L''

WHILE PATINDEX(@pattern, @old) > 0
BEGIN
    @old = STUFF(@old, PATINDEX(@pattern, @old), LEN(@pattern)-2, @replace)
END 

UPDATE CrmUserDetails SET ReadPostIds = @old
WHERE MemberNumber = @memNum

我建议为 WHILE 循环创建一个函数并立即使用它,如下所示:

UPDATE CrmUserDetails SET ReadPostIds = dbo.udfReplacePattern(ReadPostIds, '%2|_%', '')
WHERE MemberNumber = @memNum
于 2013-02-01T03:35:10.887 回答
0

使用 Cha 响应,但使用 SQL 服务器格式并举例说明:

DECLARE @old nvarchar(MAX), @pattern nvarchar(20), @replace nvarchar(20)
SELECT @old = '0,1,2'

SET @pattern = '%,%' 
SET @replace = '|'

select PATINDEX(@pattern, @old)
WHILE PATINDEX(@pattern, @old) > 0
BEGIN
    SET @old = STUFF(@old, PATINDEX(@pattern, @old), LEN(@pattern)-2, @replace)
END 

SELECT @old
于 2019-03-18T20:33:22.603 回答