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

Откуда:
Сообщений: 5
Помогите люди добрые, что не так делаю? не могу понять, вроде число полей верно указанно
MERGE SORM.Dbo.Crm_s_Pay_System_Types AS target
USING (SELECT *
         FROM OPENQUERY(MAIN, 'Select t.Pay_System_Id, t.Begin_Date, t.End_Date, t.Name_1 From Crm_s_Pay_System_Types t')) AS source(Id, BeginDate, EndDate, Naimen)
ON (target.ID = source.Id)
WHEN MATCHED THEN
  UPDATE
     SET BeginDate = source.BeginDate,
         EndDate   = source.EndDate,
         Naimen    = source.Naimen
WHEN NOT MATCHED THEN
  INSERT
    (ID, BeginDate, EndDate, Naimen)
  VALUES
    (source.Id, source.BeginDate, source.EndDate, source.Naimen) OUTPUT deleted.*, $action, inserted.* INTO SORM.Dbo.Crm_s_Pay_System_Types;
END;


сообщение: 213, уровень: 16, состояние: 1, процедура: Crm_Pay_System_Types, строка: 20 [строка начала пакета: 7]
Имя столбца или число предоставленных значений не соответствует определению таблицы.
24 мар 17, 09:06    [20328173]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
IDVT
Member

Откуда:
Сообщений: 314
.... OUTPUT deleted.*, $action, inserted.* INTO SORM.Dbo.Crm_s_Pay_System_Types;
OutPut возвращает больше колонок чем в целевой таблице SORM.Dbo.Crm_s_Pay_System_Types
24 мар 17, 09:13    [20328196]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
davron
Member

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

не подскажите как выйти с ситуации?
24 мар 17, 09:31    [20328251]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
davron
вроде число полей верно указанно
"*" - это не "указано" :-)
Никогда не используйте * вместо указания полей, если только для этого нет особой причины.
24 мар 17, 09:31    [20328252]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
davron
IDVT,

не подскажите как выйти с ситуации?
Явно перечисляйте нужные поля.
24 мар 17, 09:32    [20328257]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
davron
Member

Откуда:
Сообщений: 5
Перечислял
MERGE SORM.Dbo.Crm_s_Pay_System_Types AS target
USING (SELECT Pay_System_Id, Begin_Date, End_Date, Name_1
         FROM OPENQUERY(MAIN, 'Select t.Pay_System_Id, t.Begin_Date, t.End_Date, t.Name_1 From Crm_s_Pay_System_Types t')) AS source(Pay_System_Id, Begin_Date, End_Date, Name_1)
ON (target.ID = source.Pay_System_Id)
WHEN MATCHED THEN
  UPDATE
     SET BeginDate = source.Begin_Date,
         EndDate   = source.End_Date,
         Naimen    = source.Name_1
WHEN NOT MATCHED THEN
  INSERT
    (ID, BeginDate, EndDate, Naimen)
  VALUES
    (source.Pay_System_Id, source.Begin_Date, source.End_Date, source.Name_1) OUTPUT deleted.*, $action, inserted.Id, inserted.BeginDate, inserted.EndDate, inserted.Naimen INTO #MyTempTable;
END;

видимо все же где то делаю не так (
24 мар 17, 09:41    [20328288]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
лолл
Member

Откуда:
Сообщений: 450
deleted.*
24 мар 17, 10:13    [20328423]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
davron
Member

Откуда:
Сообщений: 5
MERGE Crm_s_Pay_System_Types AS target
USING (SELECT Pay_System_Id, Begin_Date, End_Date, Name_1
         FROM OPENQUERY(MAIN, 'Select Pay_System_Id, Begin_Date, End_Date, Name_1 From Crm_s_Pay_System_Types')) AS source(Id, BeginDate, EndDate, Naimen)
ON (target.ID = source.Id)
WHEN MATCHED THEN
  UPDATE
     SET BeginDate = source.BeginDate,
         EndDate   = source.EndDate,
         Naimen    = source.Naimen
WHEN NOT MATCHED BY TARGET THEN
  INSERT
    (ID, BeginDate, EndDate, Naimen)
  VALUES
    (source.Id, source.BeginDate, source.EndDate, source.Naimen) OUTPUT $action, Inserted.Id, Inserted.BeginDate, Inserted.EndDate, Inserted.Naimen, Deleted.Id, Deleted.BeginDate, Deleted.EndDate, Deleted.Naimen INTO Crm_s_Pay_System_Types;
END;


проблема в $action. Убираю $action все работает но записи дублируются по 2 раза.
вставляю $action выдает ошибку (сообщение: 213, уровень: 16, состояние: 1, процедура: Crm_Pay_System_Types, строка: 20 [строка начала пакета: 7]
Имя столбца или число предоставленных значений не соответствует определению таблицы.)
24 мар 17, 10:25    [20328488]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
davron
Member

Откуда:
Сообщений: 5
Спасибо всем за помощь, разобрался, можно закрывать
24 мар 17, 10:52    [20328602]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
a_voronin
Member

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

Вот пример с OUTPUT из MERGE, если кому ещё надо
+
INSERT INTO @Action (
			action,
			DELETED_RV, INSERTED_RV,
			[Chrt_Status_Agg_id]
		)
		SELECT 
			[action]
			,DELETED_RV, INSERTED_RV,
			[Chrt_Status_Agg_id]
		FROM
		(
			MERGE [Facts].[Chrt_Status_Agg] AS target
			USING (
				SELECT * FROM #MergeData_Chrt_Status_Agg
			) AS source 
			ON (
				 target.chrt_id = source.chrt_id
				AND  target.status_id = source.status_id
			)
			WHEN MATCHED AND (
				target.DELETED <> source.DELETED
				OR (target.[quantity] <> source.[quantity]) OR (target.[quantity] IS NULL AND source.[quantity] IS NOT NULL) OR (target.[quantity] IS NOT NULL AND source.[quantity] IS NULL)
				OR (target.[LastUpdated] <> source.[LastUpdated]) OR (target.[LastUpdated] IS NULL AND source.[LastUpdated] IS NOT NULL) OR (target.[LastUpdated] IS NOT NULL AND source.[LastUpdated] IS NULL)
			)
			THEN UPDATE SET -- assigining all fields including RVs
				target.DELETED = source.DELETED,
				LoadSeq = @LoadSeq
				,target.[quantity] = source.[quantity]
				,target.[LastUpdated] = source.[LastUpdated]
			WHEN NOT MATCHED BY TARGET THEN 
			INSERT 
			(
				[LoadSeq]
				,[DELETED]
				,[chrt_id]
				,[status_id]
				,[quantity]
				,[LastUpdated]
			)
			VALUES
			(
				 source.LoadSeq
				,source.DELETED
				,source.chrt_id
				,source.status_id
				,source.quantity
				,source.LastUpdated
			)
			OUTPUT $action as action 
				,ISNULL(INSERTED.[Chrt_Status_Agg_id], DELETED.[Chrt_Status_Agg_id]) AS [Chrt_Status_Agg_id]
				,DELETED.RV AS DELETED_RV, INSERTED.RV AS INSERTED_RV
			) source;
24 мар 17, 15:38    [20330056]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
aleks2
Guest
Робяты, СОРМ ни работает.

И судя по уровню вопрошения - ишо долго будет ниработать.
24 мар 17, 15:55    [20330134]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
лолл
Member

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

только в данном случае вместо вложенного MERGE в INSERT

проще писать

MERGE
OUTPUT
INTO
24 мар 17, 16:18    [20330226]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
MacaronicTragedy
Member

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

ну все теперь, можно заказывать спайсы по телефону.
24 мар 17, 16:31    [20330272]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
MacaronicTragedy
aleks2,

ну все теперь, можно заказывать спайсы по телефону.
Вам бы всё спайсы. А меня напрягает pay system types. Чего СОРМ интересует в платёжных системах? К баблу тянуццо, походу. Впрочем, ничего нового.
24 мар 17, 16:36    [20330290]     Ответить | Цитировать Сообщить модератору
 Re: MERGE прошу помощи  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
aleks2
Робяты, СОРМ ни работает.

И судя по уровню вопрошения - ишо долго будет ниработать.


Я думаю СОРМ работает и на идиотов не реагирует. Фразой "я вступил в ИГИЛ и хочу взорвать Кремль" его не проймешь. Нужно что-то более серьезное.
24 мар 17, 20:26    [20330948]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить