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

Откуда:
Сообщений: 54
Здравствуйте.
Есть БД с информацией о вызовах. Номер абонента должен выглядеть как 1234567890. В БД появились номера у которых отсутствует часть номера - 45.

Неправильные номера получаю следующим запросом:

select *
from billing
where abonenta like '123_____' and vh_trunk='BWCITY'

где после 123 пять любых символов.

Необходимо добавить 45 после 123.

Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Personal Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Спасибо.
27 июл 15, 08:25    [17937439]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
да как сделать апдейт.. тем паче у вас условие есть для определения...
если все так прямолинейно как вы написали то REPLACE(abonenta, '123', '12345')
27 июл 15, 09:00    [17937496]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
Спасибо Maxx!

SELECT abonenta, REPLACE(abonenta, '123', '12345')
FROM billing

Получилось. Огромное спасибо.
27 июл 15, 09:16    [17937538]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
royun
SELECT abonenta, REPLACE(abonenta, '123', '12345')
FROM billing
надеюсь там вот ето было ?
where abonenta like '123_____' and vh_trunk='BWCITY'

Иначе вы всю таблицу "проапдейтиили" и у вас есть занчения типа 1234545.....
27 июл 15, 11:19    [17938095]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
Maxx,
Да было.
27 июл 15, 11:20    [17938102]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
Возник такой вопрос.

Переношу неправильные записи в тестовую таблицу (была пустой)

use Table_2015
INSERT INTO test.dbo.billing
SELECT * FROM [Table_2015].[dbo].[billing]
where abonenta like '394_____' and vh_trunk='BWCITY'

Затем в тестовой

use test
update billing
set abonenta=REPLACE(abonenta, '394', '39422')
select abonenta
from billing
where abonenta like '394_____' and vh_trunk='BWCITY'

Все проходит нормально.

Затем на реальной таблице Table_2015 (более 12 млн. записей) делаю

use Table_2015
update billing
set abonenta=REPLACE(abonenta, '394', '39422')
select abonenta
from billing
where abonenta like '394_____' and vh_trunk='BWCITY'

Выходит ошибка:

Server: Msg 8152, Level 16, State 9, Line 2
String or binary data would be truncated.
The statement has been terminated.

Я уже прочитал что это значит - Длина значения в строковом поле не должна превышать длину поля, заданную при создании таблицы.

Неправильных записей было 1303 и там все сработало, а в реальной таблице, где записей более 12 млн. не срабатывает.

Объясните пожалуйста.
27 июл 15, 12:06    [17938414]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
royun,

за UPDATE без WHERE надо расстреливать!
27 июл 15, 12:09    [17938436]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Glory
Member

Откуда:
Сообщений: 104751
royun
Объясните пожалуйста.

А что тут объяснять ?
Вы заменяете 3 символа на 5.
Куда серверу поместить избыточные символы ?
27 июл 15, 12:14    [17938464]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
Glory,
Я не так часто этим занимаюсь. Можно сказать редко. Подскажите пожалуйста, как можно оптимизировать данный запрос

use Table_2015
update billing
set abonenta=REPLACE(abonenta, '394', '39422')
select abonenta
from billing
where abonenta like '394_____' and vh_trunk='BWCITY'
27 июл 15, 12:22    [17938501]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Glory
Member

Откуда:
Сообщений: 104751
royun
Подскажите пожалуйста, как можно оптимизировать данный запрос

Как можно "оптимизировать" недостаточный размер поля ?
Наверное увеличением размера этого поля

declare @t table (f1 varchar(3))
insert @t values('394')

update @t set f1=REPLACE(f1, '394', '39422')
27 июл 15, 12:24    [17938510]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Кролик-зануда
Guest
royun,

а ничего, что у вас 2 запроса:
1. update без where
2. select по условию
27 июл 15, 12:25    [17938513]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
Кролик-зануда,

Я уже писал, что "Я не так часто этим занимаюсь. Можно сказать редко."
27 июл 15, 12:28    [17938537]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Glory
Member

Откуда:
Сообщений: 104751
use Table_2015
update billing
set abonenta=REPLACE(abonenta, '394', '39422')
where abonenta like '394_____' and vh_trunk='BWCITY'
27 июл 15, 12:29    [17938548]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
Glory,
Спасибо.
27 июл 15, 12:30    [17938564]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Glory
Member

Откуда:
Сообщений: 104751
royun
Спасибо.

Кстати, вы уже поменяли 394 на 39422 столько раз, сколько раз запускали ваш скрипт
Если один, то 39422
Если два, то 3942222
Если три, то 394222222
и тд
27 июл 15, 12:32    [17938579]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
Glory
royun
Спасибо.

Кстати, вы уже поменяли 394 на 39422 столько раз, сколько раз запускали ваш скрипт
Если один, то 39422
Если два, то 3942222
Если три, то 394222222
и тд
Причём не только в начале поля
27 июл 15, 12:34    [17938586]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 663
Пока писал уже ответили. Но я все равно опубликую, потому что у меня еще про STUFF написано
royun
Glory,
Я не так часто этим занимаюсь. Можно сказать редко. Подскажите пожалуйста, как можно оптимизировать данный запрос

use Table_2015
update billing
set abonenta=REPLACE(abonenta, '394', '39422')
select abonenta
from billing
where abonenta like '394_____' and vh_trunk='BWCITY'

Вы не правильно пишете запрос. У вас получается 2 запроса
update billing
set abonenta=REPLACE(abonenta, '394', '39422')
----ВСЁ! КОНЕЦ! Это и есть апдейт без WHERE, за который нужно растреливать (c) iap
select abonenta
from billing
where abonenta like '394_____' and vh_trunk='BWCITY'
----- А это другой запрос, он просто выводит данные

+ Махх поспешил, REPLACE меняет все вхождения строки. Т.е 3490000349 превратится в 39422000039422
Лучше всего написать запрос на выборку старых и новых данны, а запем превратить его в апдэйт. И не забывайте алиасы.
SELECT [b].abonenta, STUFF([b].abonenta, 1, 3, '39422')
from billing [b]
where [b].abonenta like '394_____' and [b].vh_trunk='BWCITY'
/*
UPDATE [b]
SET abonenta = STUFF([b].abonenta, 1, 3, '39422')
from billing [b]
where [b].abonenta like '394_____' and [b].vh_trunk='BWCITY'
*/

+ последний комент от Glory
27 июл 15, 12:37    [17938604]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
iap, Glory

Пока все это делаю на тестовой таблице.
27 июл 15, 12:40    [17938622]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
royun
Member

Откуда:
Сообщений: 54
Guf,
Очень благодарен за развернутый ответ.
27 июл 15, 12:42    [17938633]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Guf
+ Махх поспешил, REPLACE

никуда я не спешил - яж специально написал
Maxx
если все так прямолинейно как вы написали то REPLACE(abonenta, '123', '12345')

Я ж не в курсе ,что

royun
Я уже писал, что "Я не так часто этим занимаюсь. Можно сказать редко."
27 июл 15, 12:47    [17938665]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 663
Maxx
никуда я не спешил - яж специально написал
Maxx
если все так прямолинейно как вы написали то REPLACE(abonenta, '123', '12345')


Значит поспешил я. Я не заметил ключевых слов "если все так прямолинейно"
27 июл 15, 12:51    [17938693]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
кстате усе молодцы
Маска для like
SELECT [b].abonenta, STUFF([b].abonenta, 1, 3, '39422')
from billing [b]
where [b].abonenta like '394_____' and [b].vh_trunk='BWCITY'

нефига не исключает ситуацию для записей 39422*******
27 июл 15, 12:59    [17938745]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Кролик-зануда
Guest
Maxx,

это еще почему?

with billing as
(select abonenta='39422*******' ,vh_trunk='BWCITY'
SELECT [b].abonenta, STUFF([b].abonenta, 1, 3, '39422')
from billing [b]
where [b].abonenta like '394_____' and [b].vh_trunk='BWCITY'


возвращает ровно ноль записей
27 июл 15, 13:43    [17939088]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Кролик-зануда,

а где вы увидели.... что длина поля обязательно должна быть меньше на 2 символа ?
В вашем случае - согласен (в частном) в общем....сомнительно,хотя и обратного условия ТС не озвучил
27 июл 15, 14:01    [17939259]     Ответить | Цитировать Сообщить модератору
 Re: Добавить символ  [new]
Кролик-зануда
Guest
Maxx,

в исходном сообщении
royun
где после 123 пять любых символов.
27 июл 15, 14:26    [17939506]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить