Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 избавиться от курсора  [new]
Volodya
Member

Откуда:
Сообщений: 450
Доброе времени суток!
Имеется таблица с адресами, адреса типа:

г. Москва, пр. Мира
Москва г., пр. Мира
Москва г., Мира пр.

то есть адреса заведены в разных форматах.
Есть задача привести их к одному формату, как в первой строке.

Сделал курсор, но так как замен в таблице @t много, курсор работает очень долго.
Что добавить в запрос, чтобы избавиться от курсора и использовать апдейт?

declare @t table (wrong nvarchar(50), correct nvarchar(50))
insert @t values ('Москва г.', 'г. Москва'), ('Мира пр.', 'пр. Мира')

declare @wrong nvarchar(50), @correct nvarchar(50)
DECLARE cur CURSOR FOR 
	select wrong, correct from @t
OPEN cur

FETCH NEXT FROM cur INTO @wrong, @correct

WHILE @@FETCH_STATUS = 0
BEGIN
    update [Address] 
		set [Address] = [dbo].[func_Replace] ([Address], @wrong, @correct)

    FETCH NEXT FROM cur	INTO @wrong, @correct
END 
CLOSE cur
DEALLOCATE cur
18 апр 14, 10:00    [15899598]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
guest123456
Guest
Volodya,

UPDATE 
	a
SET
	a.[Address] = tempdb.[correct]
FROM 
	[Address] AS a
INNER JOIN 
	@t AS t
ON
	a.[Address] = t.wrong
18 апр 14, 10:08    [15899636]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
guest123456
Guest
guest123456,

где tempdb - intellisence заменил алиас t ((
18 апр 14, 10:09    [15899648]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
aleks2
Guest
declare @t table (wrong nvarchar(50), correct nvarchar(50))
insert @t values ('Москва г.', 'г. Москва'), ('Мира пр.', 'пр. Мира')

-- если твоя "функция" ничо чрезмерно интеллектуального не творит,
-- то фсе гораздо проще
update a set Address = t.correct
  from [Address] A inner join @t t on a.Address = t.wrong;
18 апр 14, 10:10    [15899652]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Volodya
Member

Откуда:
Сообщений: 450
a.[Address] = t.wrong
такое равенство не проходит, так как a.[Address] = 'Москва г., пр. Мира'
то есть в строке адреса еще нужно найти кусок под замену
18 апр 14, 10:14    [15899669]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Volodya
a.[Address] = t.wrong
такое равенство не проходит, так как a.[Address] = 'Москва г., пр. Мира'
то есть в строке адреса еще нужно найти кусок под замену
REPLACE() написать не судьба?
18 апр 14, 10:16    [15899674]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Приведите таблицу хотя бы к первой нормальной форме. Ваше решение - временный костыль.
18 апр 14, 10:31    [15899746]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Volodya
Member

Откуда:
Сообщений: 450
так работает, приемлемо по скорости.

declare @t table (wrong nvarchar(50), correct nvarchar(50))
insert @t values ('Москва г.', 'г. Москва'), ('Мира пр.', 'пр. Мира')

declare @wrong nvarchar(50), @correct nvarchar(50)
DECLARE cur CURSOR FOR 
	select wrong, correct from @t
OPEN cur

FETCH NEXT FROM cur INTO @wrong, @correct

WHILE @@FETCH_STATUS = 0
BEGIN

UPDATE 
	a
SET
	a.[Address] = [dbo].[func_Replace] ([Address], @wrong, @correct, 0)
FROM 
	Address AS a
INNER JOIN 
	@t AS t
ON
	a.[Address] like ('%' + @wrong + '%')

    FETCH NEXT FROM cur	INTO @wrong, @correct
END 
CLOSE cur
DEALLOCATE cur




Всем спасибо. Если еще будут варианты без курсора с удовольствием проверю )
18 апр 14, 10:34    [15899766]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Volodya
Member

Откуда:
Сообщений: 450
Владислав, я не могу править источник, задача поставлена сделать костыль )
18 апр 14, 10:35    [15899775]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
aleks2
Guest
А нахера тут функция?
18 апр 14, 10:36    [15899788]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Владислав Колосов
Приведите таблицу хотя бы к первой нормальной форме. Ваше решение - временный костыль.
Невозможно победить неоднозначность записи адресов, названий улиц и т.п. программно.
Никакая нормализация не поможет.
Человеческий фактор.
18 апр 14, 10:37    [15899794]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
aleks2
Guest
А нахера тут курсор?

ЗЫ. Тредстартера следует гнать с работы по "полному служебному несоответствию".
18 апр 14, 10:37    [15899798]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Volodya
Member

Откуда:
Сообщений: 450
чтобы в таком адресе

Москва г., пр. Мира

найти такой кусок

Москва г.
18 апр 14, 10:38    [15899802]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
автор
Невозможно победить неоднозначность записи адресов, названий улиц и т.п. программно.

Как это? Цивилизованные люди давно используют КЛАДР.
18 апр 14, 10:44    [15899860]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Владислав Колосов
автор
Невозможно победить неоднозначность записи адресов, названий улиц и т.п. программно.

Как это? Цивилизованные люди давно используют КЛАДР.
КЛАДР умер, да здравствует ФИАС?

Наверно, сами-то КЛАДР и не видели изнутри?
А я имел такое счастье
18 апр 14, 10:58    [15899962]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
iap, видел и успешно используем. Но речь ведь не об этом, не так ли?
18 апр 14, 13:56    [15901134]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Владислав Колосов
iap, видел и успешно используем. Но речь ведь не об этом, не так ли?
Не стал бы упоминать КЛАДР в качестве эталона.
Там столько ошибок...
18 апр 14, 14:00    [15901159]     Ответить | Цитировать Сообщить модератору
 Re: избавиться от курсора  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Да, конечно... Не точно выразился. Мы на самом деле используем справочник ФИАС, но в старом формате, для совместимости.
18 апр 14, 14:12    [15901232]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить