版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yenange/article/details/81940190
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
planId BIGINT PRIMARY KEY,
dbIds VARCHAR(500)
)
GO
---- 插入测试数据 -------
---- 要求:去除dbIds中的 12456
INSERT INTO t VALUES (1,'12345,67890,23456,98723')
INSERT INTO t VALUES (2,'12345,67890,12456,98723')
INSERT INTO t VALUES (3,'12345,67891,12456,98723')
INSERT INTO t VALUES (4,'12345,67891,12456')
GO
IF OBJECT_ID('[dbo].[Fun_Split]') IS NOT NULL DROP FUNCTION [dbo].[Fun_Split]
GO
-- =============================================
-- Author : yenange
-- Create date: 2014-03-04
-- Description: 切分字符串
-- Example : SELECT * FROM [dbo].[Fun_Split]('a,b,d,c',',')
-- =============================================
CREATE FUNCTION [dbo].[Fun_Split]
(
@str NVARCHAR(MAX),
@split NVARCHAR(MAX)
)
RETURNS @table TABLE ([id] NVARCHAR(max))
AS
BEGIN
IF LEN(@split) = 0
BEGIN
SET @split = N','
END
DECLARE @xml XML;
SET @xml = CONVERT(XML, '<x><![CDATA[' + replace(CONVERT(VARCHAR(MAX), @str), @split, ']]></x><x><![CDATA[') + ']]></x>')
INSERT INTO @table
SELECT item
FROM (SELECT c.value('text()[1]', 'nvarchar(4000)') [item]
FROM @xml.nodes('/x') t(c)) t
WHERE item IS NOT NULL
RETURN
END
GO
------ 更新操作 ---------
;WITH cte AS (
SELECT *
,STUFF((
SELECT ','+f2.id
FROM dbo.Fun_Split(t.dbIds,',') f2
WHERE f2.id!='12456'
FOR XML PATH('')
),1,1,'') AS dbIds2
FROM t WHERE EXISTS(
SELECT 1 FROM dbo.Fun_Split(t.dbIds,',') fs
WHERE fs.id='12456'
)
)
UPDATE a
SET a.dbIds=b.dbIds2
FROM t AS a INNER JOIN cte AS b ON a.planId=b.planId
------- 查看结果 ---------
--12456 已经去除
SELECT * FROM t
/*
planId dbIds
-------------------- ------------------------
1 12345,67890,23456,98723
2 12345,67890,98723
3 12345,67891,98723
4 12345,67891
*/