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

Откуда:
Сообщений: 257
Доброго времени суток.

Есть задача
Стоит бд 1с, там хранится информация о сотрудниках, написал ХП, которая вытягивает из 1с данные, каждый раз полный список сотрудников

У себя на sql server 2012 создал таблицу

create table Empl(
id int primary key identity(1,1),
Surname varchar(20),
FirstName varchar(20),
LastName varchar(20),
isWork
)

В процедуре, в которой вытягиваю данные из 1с, после чего делаю insert в таблицу Empl
Задача стоит следующая, если данных в таблице Empl нету, то делаю инсерт, если есть то игнорирую записи, НО если запись есть у меня в таблице, но 1с не прислало мне его, то в своей таблице Empl делаю апдейт IsWork = 0

Пока что додумался только до написания курсора, но как-то думаю он получится громоздким((

Т.е в теле процедуры, которой тяну данные заполняю временную таблицу потом по ней работаю по строчно

Подскажите, пожалуйста, есть ли другой способ выполнить данную задачу не используя курсор

Заранее спасибо за Ваши ответы
3 окт 13, 20:10    [14920852]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
invm
Member

Откуда: Москва
Сообщений: 9402
user87
Подскажите, пожалуйста, есть ли другой способ выполнить данную задачу не используя курсор
Инструкцией MERGE.
3 окт 13, 20:28    [14920891]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Либо в 2 инструкции, insert и update.
3 окт 13, 20:49    [14920957]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Как-то так:
insert into Emp
select * from #temp
where id not in (select id from Emp)

GO

update Emp
set IsWork = 0
where id not in (select id from #temp)
3 окт 13, 20:58    [14920977]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
user87
Member

Откуда:
Сообщений: 257
Спасибо большое, но там тоже курсор писать надо, так как из временной таблицы я выбираю данные


select @param1 = param1,@param2 = param2,... from #temp
(
3 окт 13, 22:06    [14921160]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Покажите полный код вашей процедуры, тогда быть может вам помогут.
3 окт 13, 22:13    [14921178]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Glory
Member

Откуда:
Сообщений: 104760
user87
но там тоже курсор писать надо, так как из временной таблицы я выбираю данные


select @param1 = param1,@param2 = param2,... from #temp
(

И зачем вы так делаете ? Что мешает работать сразу целиком с таблицей #temp ?
3 окт 13, 22:36    [14921223]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
user87
Member

Откуда:
Сообщений: 257
Вот что пытаюсь сделатб
create procedure GetPersonData
@Surname varchar(20),
@FirstName varchar(20),
@LastName varchar(20),
@BirthDay Date
as

CREATE TABLE #PersonDate
(
Surname varchar(20),
FirstName varchar(20),
LastName varchar(20),
BirthDay Date
)



---- Забираем данные из 1С
insert #PersonDate
exec GetDataFroOtherSystem

select
@Surname = Surname,
@FirstName =FirstName,
@LastName= LastName,
@BirthDay = BirthDay
from #PersonDate


MERGE Employes AS target
USING (SELECT @Surname ,@FirstName ,@LastName,@BirthDay ) AS source (UnitMeasureCode, Name)
ON (target.Surname = source.Surname)
WHEN MATCHED THEN
UPDATE
SET FirstName = source.FirstName,lastName = source.lastName ,Surname = source.Surname,BirthDay = source.BirthDay
WHEN NOT MATCHED THEN
INSERT (SELECT Surname ,FirstName ,LastName,BirthDay)
VALUES (source.FirstName,source.lastName ,source.Surname,source.BirthDay);
OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
END;
3 окт 13, 22:41    [14921232]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
А зачем вы используете переменные?
3 окт 13, 22:50    [14921248]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
И что произойдет с однофамильцами?
3 окт 13, 22:51    [14921249]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
user87
Member

Откуда:
Сообщений: 257
Просто пока не знаю как проверку поставить на имя фамилию и отчество
3 окт 13, 22:59    [14921273]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
user87,

MERGE INTO Employes e
USING (
  SELECT FirstName, LastName, Surname, BirthDay
  from #temp) t
ON (e.FirstName = t.FirstName and e.LastName = t.LastName and e.Surname = t.Surname)
WHEN MATCHED THEN 
  UPDATE SET e.BirthDay = t.BirthDay	
WHEN NOT MATCHED THEN
  INSERT (e.FirstName, e.LastName, e.Surname, e.BirthDay)
  VALUES (t.FirstName, t.LastName, t.Surname, t.BirthDay)


Ну а дальше update из предыдущего моего поста.
3 окт 13, 23:17    [14921310]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Вопрос в том, что вы будете делать при полном совпадении ФИО у разных людей :) Лучше тащите id из 1Ски.
3 окт 13, 23:20    [14921313]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
Remind
Member

Откуда: UK
Сообщений: 523
А, вру, можно в 1 merge уложиться:

MERGE INTO Employes e
USING (
  SELECT FirstName, LastName, Surname, BirthDay
  from #temp) t
ON (e.FirstName = t.FirstName and e.LastName = t.LastName and e.Surname = t.Surname)
WHEN MATCHED THEN 
  UPDATE SET e.BirthDay = t.BirthDay	
WHEN NOT MATCHED BY TARGET THEN
  INSERT (e.FirstName, e.LastName, e.Surname, e.BirthDay)
  VALUES (t.FirstName, t.LastName, t.Surname, t.BirthDay)
WHEN NOT MATCHED BY SOURCE THEN
  UPDATE SET e.isWork = 0 
3 окт 13, 23:29    [14921323]     Ответить | Цитировать Сообщить модератору
 Re: Как обойтись без курсора  [new]
user87
Member

Откуда:
Сообщений: 257
Огромное Вам спасибо!!!

Теперь могу со спокойной душой идти домой, спасибо еще раз
3 окт 13, 23:59    [14921380]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить