Как сделать соотнесенное обновление в данном конкретном случае? - PullRequest
0 голосов
/ 16 октября 2018

Я столкнулся с проблемой.

If Object_Id('abc','U') is not null
    Drop table  abc
Go
Create Table abc
(
    Strng varchar(max)

)
GO
Insert abc
Select 'shakuntala'
Union All
Select 'shakuntala-anjna'
Union All
Select 'shakuntala-anjna-sharat'
GO
Create Table def
(
    Strng varchar(max),
    Initcap varchar(max)
)
GO
Insert def
Select 'shakuntala', 'Shakuntala'
Union All
Select 'shakuntala-anjna','Anjna'
Union ALl
Select 'shakuntala-anjna','Shakuntala'
Union All
Select 'shakuntala-anjna-sharat', 'Anjna'
Union ALl
Select 'shakuntala-anjna-sharat', 'Shakuntala'
Union ALl
Select 'shakuntala-anjna-sharat', 'Sharat'
GO

Select * From abc возвращает

Strng
-------
shakuntala
shakuntala-anjna
shakuntala-anjna-sharat

Я хочу обновить таблицу abc, используя таблицу def, чтобы после обновления Select * From abc возвращает

Strng
-------
Shakuntala
Shakuntala-Anjna
Shakuntala-Anjna-Sharat

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

************* ПРЕДУПРЕЖДЕНИЕ ******************** НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД В ПРОИЗВОДСТВЕ Это следует рассматривать как простойупражнение, чтобы продемонстрировать, как можно добиться рекурсивного обновления.С объемами он будет работать плохо

Что касается попытки сделать использование заглавных букв в словах, то оно также довольно плохое, поскольку в заглавных буквах слишком много правил, зависящих от локали, языковых правил и обычаев.

В SQLНа сервере нет простого способа сделать это без использования функции CLR ************* ПРЕДУПРЕЖДЕНИЕ ********************

If Object_Id('tempdb..#abc','U') is not null
    Drop table  #abc
Go
Create Table #abc
(
    Strng varchar(max)

)
GO
Insert #abc
Select 'shakuntala'
Union All
Select 'shakuntala-anjna'
Union All
Select 'shakuntala-anjna-sharat'
GO

If Object_Id('tempdb..#def','U') is not null
    Drop table  #def
Go
Create Table #def
(
    Strng varchar(max),
    Initcap varchar(max)
)
GO
Insert #def
Select 'shakuntala', 'Shakuntala'
Union All
Select 'shakuntala-anjna','Anjna'
Union ALl
Select 'shakuntala-anjna','Shakuntala'
Union All
Select 'shakuntala-anjna-sharat', 'Anjna'
Union ALl
Select 'shakuntala-anjna-sharat', 'Shakuntala'
Union ALl
Select 'shakuntala-anjna-sharat', 'Sharat'
go

select *
from #abc a

while @@RowCount > 0
begin
    update a
    set a.Strng = replace(a.Strng, d.Initcap, d.Initcap)
    from #abc a
    inner join #def d
    on d.Strng = a.Strng
    and a.Strng not like '%' + d.Initcap + '%' collate Latin1_General_100_CS_AS
end

select *
from #abc a

Приведенный выше код дает желаемый результат

0 голосов
/ 16 октября 2018

Если бы в таблице def был столбец с ID, я бы использовал WHILE.

Таким образом, вы можете использовать CURSOR:

DECLARE @s VARCHAR(256), @i VARCHAR(256);

DECLARE c CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY 
FOR SELECT Strng, Initcap FROM def;

OPEN c;
FETCH c INTO @s, @i;

WHILE @@FETCH_STATUS = 0 BEGIN
    UPDATE abc 
    SET Strng = REPLACE(Strng,@i, @i)
    WHERE Strng = @s;

    FETCH c INTO @s, @i;
END

CLOSE c;
DEALLOCATE c;

Select * From abc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...