Sql server SQL中的大容量替换

Sql server SQL中的大容量替换,sql-server,Sql Server,我试图通过表的一列删除特定单词。在表#Temp中,需要调整字段“Text1”,以便从Text1中删除表#集合中的所有字符串。我总是出错。我是否需要为特定情况定义函数 子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情 预期结果: 1.此文本 2.弄错 编辑:使用以下光标解决该问题: DECLARE @ReplaceValue as NVARCHAR(50); DECLARE db_cursor CURSOR FOR SELECT Name F

我试图通过表的一列删除特定单词。在表#Temp中,需要调整字段“Text1”,以便从Text1中删除表#集合中的所有字符串。我总是出错。我是否需要为特定情况定义函数

子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情

预期结果:
1.此文本
2.弄错

编辑:使用以下光标解决该问题:

DECLARE @ReplaceValue as NVARCHAR(50);

DECLARE db_cursor CURSOR FOR
    SELECT Name
    FROM #Collections

OPEN db_cursor
FETCH NEXT FROM db_cursor into  @ReplaceValue

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE #Temp
    SET Text1 = REPLACE(Text1, ' ' + @ReplaceValue + ' ', ' ')
    WHERE CHARINDEX(' ' + @ReplaceValue + ' ', Text1) > 0
    FETCH NEXT FROM db_cursor INTO @ReplaceValue
END

CLOSE db_cursor
DEALLOCATE db_cursor

请根据您的需求查找代码示例,这里我使用了物理表而不是#表,因为函数中不支持#表

IF OBJECT_ID('Temp') IS NOT NULL DROP TABLE Temp
IF OBJECT_ID('Collections') IS NOT NULL DROP TABLE Collections

CREATE TABLE Temp (Text1 VARCHAR(200))
CREATE TABLE Collections (Name VARCHAR(10))

INSERT INTO Temp (Text1)
VALUES
('This is a text'),
('I made a mistake'),
('I am a SuperStar')



INSERT INTO Collections (Name)
VALUES
('is'),
('a'),
('I')

GO

CREATE FUNCTION [dbo].[Split]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE 
AS
RETURN 
(
WITH Split(stpos,endpos) 
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)

GO 

CREATE Function GetModifiedValue
(
@String Varchar(100)
)
RETURNS Varchar(100)
AS
BEGIN

Declare @Result Varchar(100)

Select @Result=COALESCE(@Result + ' ', '')+Data From dbo.Split(@String,' ') Where Data not in (Select Name from Collections)

RETURN @Result

END

Go

Select dbo.GetModifiedValue(Text1) From Temp

此代码将帮助您

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp
IF OBJECT_ID('tempdb..#Collections') IS NOT NULL DROP TABLE #Collections

CREATE TABLE #Temp (ID INT IDENTITY,Text1 VARCHAR(200))
CREATE TABLE #Collections (ID INT IDENTITY,Name VARCHAR(10))

INSERT INTO #Temp (Text1)
VALUES
('This is a text'),
('I Made a mistake')


INSERT INTO #Collections (Name)
VALUES
('is'),
('a'),
('I')

;WITH cte 
     AS (SELECT id, 
                text1 
         FROM   (SELECT id, 
                        split.a.value('.', 'nvarchar(1000)') AS Text1 
                 FROM   (SELECT id, 
                                Cast('<S>' + Replace(text1, ' ', '</S><S>') + 
                                     '</S>' 
                                     AS 
                                     XML) AS 
                                Text1 
                         FROM   #temp)AS A 
                        CROSS apply text1.nodes('S') AS Split(a))DT 
         WHERE  dt.text1 NOT IN (SELECT DISTINCT NAME 
                                 FROM   #collections)) 
SELECT DISTINCT Id, 
                Stuff((SELECT ' ' + text1 
                       FROM   cte i 
                       WHERE  i.id = o.id 
                       FOR xml path ('')), 1, 1, '') AS ExpectedText 
FROM   cte o 

提供一个示例和预期的结果,并用它来确定问题的日期,生成有效的insert语句,允许其他人复制粘贴itI调整它。感谢您的通知。最简单的方法是通过游标/循环在存储过程中实现。但是,使用递归查询也可以做到这一点
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp
IF OBJECT_ID('tempdb..#Collections') IS NOT NULL DROP TABLE #Collections

CREATE TABLE #Temp (ID INT IDENTITY,Text1 VARCHAR(200))
CREATE TABLE #Collections (ID INT IDENTITY,Name VARCHAR(10))

INSERT INTO #Temp (Text1)
VALUES
('This is a text'),
('I Made a mistake')


INSERT INTO #Collections (Name)
VALUES
('is'),
('a'),
('I')

;WITH cte 
     AS (SELECT id, 
                text1 
         FROM   (SELECT id, 
                        split.a.value('.', 'nvarchar(1000)') AS Text1 
                 FROM   (SELECT id, 
                                Cast('<S>' + Replace(text1, ' ', '</S><S>') + 
                                     '</S>' 
                                     AS 
                                     XML) AS 
                                Text1 
                         FROM   #temp)AS A 
                        CROSS apply text1.nodes('S') AS Split(a))DT 
         WHERE  dt.text1 NOT IN (SELECT DISTINCT NAME 
                                 FROM   #collections)) 
SELECT DISTINCT Id, 
                Stuff((SELECT ' ' + text1 
                       FROM   cte i 
                       WHERE  i.id = o.id 
                       FOR xml path ('')), 1, 1, '') AS ExpectedText 
FROM   cte o 
Id  ExpectedText
-----------------
1   This text
2   Made mistake