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

Откуда:
Сообщений: 97
Всем доброго времени суток.
заполняем таблицу 1 данными address из временной таблицы #address, получается
contractid address
1 null
2 ул. Ленина
3 ул. Сталина
4 null
5 null
Далее удаляем и заполняем временную таблицу #address другими адресами
#address
contractid address
1 ул.1 мая
2 ул. 9 октября
3 ул. Декабристов
4 ул. Мира
5 ул. Химиков

Подскажите, как мне проапдейтить таблицу 1, чтобы поле address заполнилось только теми значениями, где оно null чтобы существующие адреса (ул.Химиков, ул. Сталина) не затерлись т.е. вот так получилось на выходе
contractid address
1 ул.1 мая
2 ул. Ленина
3 ул. Сталина
4 ул. Мира
5 ул. Химиков
21 ноя 13, 10:22    [15166469]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
update t
set address = a.address
from таблица1 t
     inner join #address a on a.contractid = t.contractid
where t.address is null
21 ноя 13, 10:42    [15166596]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
sabitaidr
Member

Откуда:
Сообщений: 97
Гость333,
я так и делаю, мой запрос:
update Energo..t_BkiTUTDF
set Address2=(select Segment_Tag+char(9)+Address_Type+char(9)+Postal_Code+char(9)+Country+char(9)+Region+char(9)+Unknown_field1+char(9)+District+char(9)+Location+char(9)+Street_Type+char(9)+Street+char(9)+House_Number+char(9)+Block+char(9)+Building+char(9)+Apartment+char(9)+Status+char(9)+Since
from Energo..t_BkiTUTDF
inner join #AddressRecord
on Energo..t_BkiTUTDF.contractid=#AddressRecord.f_contractid
where Energo..t_BkiTUTDF.address2 is null)

он выдает ошибку:
Msg 512, Level 16, State 1, Procedure p_RptEnergo_BkiTUTDF, Line 1066
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression
21 ноя 13, 10:49    [15166654]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
sabitaidr
я так и делаю

Абсолютно не так.
Вы безусловно апдейтите каждую строку таблицы t_BkiTUTDF, при этом пытаетесь в каждое поле Address2 (скалярное значение) записать результат выполнения подзапроса (множество значений).
21 ноя 13, 10:55    [15166691]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
sabitaidr
Member

Откуда:
Сообщений: 97
Гость333,
Извините, понял, тогда подскажите как в моем случае сделать?
21 ноя 13, 10:56    [15166703]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
sabitaidr
Member

Откуда:
Сообщений: 97
Гость333,
в самом начале я сделал так:
update Energo..t_BkiTUTDF
set Address2=(select Segment_Tag+char(9)+Address_Type+char(9)+Postal_Code+char(9)+Country+char(9)+Region+char(9)+Unknown_field1+char(9)+District+char(9)+Location+char(9)+Street_Type+char(9)+Street+char(9)+House_Number+char(9)+Block+char(9)+Building+char(9)+Apartment+char(9)+Status+char(9)+Since
from #AddressRecord
where Energo..t_BkiTUTDF.contractid=#AddressRecord.f_contractid)

Все получилось хорошо, но в некоторых полях Address2 появились значения null, вот мне нужно их тоже заполнить так, как я уже писал в вопросе
21 ноя 13, 10:59    [15166723]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
sabitaidr,

У вас конкатенируются значения Segment_Tag, Address_Type, Postal_Code и ещё много других. Если хотя бы одно из этих значений равно NULL, то вся результирующая строка будет равна NULL. Проверьте, возможно причина в этом.
21 ноя 13, 11:04    [15166762]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Чтобы исправить конкатенацию NULL'ов, можно использовать функцию CONCAT (доступно только в MSSQL 2012), либо использовать ISNULL:
isnull(Segment_Tag, '')+char(9)+isnull(Address_Type, '')+char(9)+isnull(Postal_Code, '')+...
21 ноя 13, 11:07    [15166779]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
sabitaidr
Member

Откуда:
Сообщений: 97
Гость333,
с этим все нормально. Порядок действий таков:
1. Заполняю временную таблицу #AddressRecord данными
2. Заполняю Energo..t_ResNBKI_TUTDF (поле Address2 ) данными из временной таблицы. некоторые поля Address2 проставляются, некоторые остаются значениями null (это нормально, их там просто не может быть)
3. Очищаю таблицу #AddressRecord
4. Заполняю временную таблицу #AddressRecord другими данными
5. Необходимо проапдейтить Energo..t_ResNBKI_TUTDF, поле Address2 только те поле, где это значение null, а где не null оно не затиралось. То есть как уже говорил
1 null
2 ул. Ленина
3 ул. Сталина
4 null
5 null
после заполнения новыми данными временная таблица выглядит так:
1 ул.1 мая
2 ул. 9 октября
3 ул. Декабристов
4 ул. Мира
5 ул. Химиков

и когда я буду апдейтить Energo..t_ResNBKI_TUTDF нужно чтобы ул.Ленина и ул.Сталина не затерлись данными ул. 9 октября и ул. Декабристов соответственно
21 ноя 13, 11:23    [15166885]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
Гость333
Member

Откуда:
Сообщений: 3683
sabitaidr,

Чем не устраивает запрос 15166596?
21 ноя 13, 11:33    [15166972]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение данных из временной таблицы  [new]
sabitaidr
Member

Откуда:
Сообщений: 97
Гость333,
Подошел, неправильно сначала сделал, все работает, спасибо Вам=))))
21 ноя 13, 11:40    [15167040]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить