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

Откуда: Гондурас
Сообщений: 1034
Уважаемый форум,

Простая задача: в триггере необходимо вставить значения из одной строки в Таблице 1 в несколько строк в таблице 2. Проблема в том, что возвращается ошибка "Подзапрос возвращает несколько значений..." и т.д. Не могу никак разобраться, почему несколько значений, если по идее в подзапросе должна быть только одна строка?
Код:
Set @imid=(SELECT IMID FROM Inserted)		
UPDATE a Set db5_Score_Color_RLT=c.insp_Score_Color_Rep_New,db5_Score_M_T_RLT=c.insp_Score_Matur_Rep_New,db5_Score_B_S_RLT=c.insp_Score_Body_Rep_New,db5_Score_QltyM_RLT=c.insp_Score_QltyM_Rep_New,db5_Score_Total_RLT=c.insp_Score_Total_Rep_New 
		FROM tbl_DB5 AS a INNER JOIN (SELECT [insp_Score_Color_Rep_New],[insp_Score_Matur_Rep_New],[insp_Score_Body_Rep_New],[insp_Score_QltyM_Rep_New],[insp_Score_Total_Rep_New],IMID FROM Inserted WHERE(IMID=@imid)) as c ON c.IMID=a.db5_IMID WHERE(a.db5_Sample in ('RPLS','RFLS'))


Спасибо!
13 янв 14, 14:52    [15408334]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Не могу никак разобраться, почему несколько значений, если по идее в подзапросе должна быть только одна строка?

Set @imid=(SELECT IMID FROM Inserted)
потому что Inserted - это таблица
13 янв 14, 14:55    [15408351]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а зачем ето вообще надо ?
Set @imid=(SELECT IMID FROM Inserted)

а патом
FROM Inserted WHERE(IMID=@imid)) 


смысл какой тайный то ?
13 янв 14, 14:55    [15408354]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Glory
IFK
Не могу никак разобраться, почему несколько значений, если по идее в подзапросе должна быть только одна строка?

Set @imid=(SELECT IMID FROM Inserted)
потому что Inserted - это таблица


Это я знаю. И что? Там по идее должна быть только одна запись.
13 янв 14, 14:58    [15408372]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Это я знаю. И что? Там по идее должна быть только одна запись.

Если бы там была одна запись, то ошибки бы не было
13 янв 14, 15:01    [15408385]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Glory
IFK
Это я знаю. И что? Там по идее должна быть только одна запись.

Если бы там была одна запись, то ошибки бы не было


Угу, но иногда почему-то получается не одна. Или подзапрос возврщает не одну. Почему - понять не могу. :(
13 янв 14, 15:02    [15408395]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Glory
пропущено...

Если бы там была одна запись, то ошибки бы не было


Угу, но иногда почему-то получается не одна. Или подзапрос возврщает не одну. Почему - понять не могу. :(

Потому что команда, на которую написан триггер, затронула больше одной записи.
Вам не приходила в голову такая мысль ?
13 янв 14, 15:03    [15408414]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Glory
IFK
пропущено...


Угу, но иногда почему-то получается не одна. Или подзапрос возврщает не одну. Почему - понять не могу. :(

Потому что команда, на которую написан триггер, затронула больше одной записи.
Вам не приходила в голову такая мысль ?


Приходила, но я не понимаю, почему, если апдейтится только одна запись. В форме апдейтится одно поле и должен сработать триггер, что он и делает. Вот полный триггер:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Trigger_Inspection_Scoring] 
   ON  [dbo].[tbl_Inspection] 
   AFTER UPDATE
AS	DECLARE @imid varchar(max)
	IF UPDATE(insp_Score_Total_Rep_New)
BEGIN
	SET NOCOUNT ON;
	Set @imid=(SELECT IMID FROM Inserted)
	UPDATE a Set db5_Score_Color_RLT=c.insp_Score_Color_Rep_New,db5_Score_M_T_RLT=c.insp_Score_Matur_Rep_New,db5_Score_B_S_RLT=c.insp_Score_Body_Rep_New,db5_Score_QltyM_RLT=c.insp_Score_QltyM_Rep_New,db5_Score_Total_RLT=c.insp_Score_Total_Rep_New 
	FROM tbl_DB5 AS a INNER JOIN (SELECT [insp_Score_Color_Rep_New],[insp_Score_Matur_Rep_New],[insp_Score_Body_Rep_New],[insp_Score_QltyM_Rep_New],[insp_Score_Total_Rep_New],IMID FROM Inserted WHERE(IMID=@imid)) as c ON c.IMID=a.db5_IMID WHERE(db5_IMID=@imid and db5_Sample in ('RPLS','RFLS'))
END
13 янв 14, 15:10    [15408449]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Приходила, но я не понимаю, почему, если апдейтится только одна запись.

Ага а сервер врет и сам заносит в inserted левые записи.

IFK
Вот полный триггер:

А причем тут триггер ? Где проверка того, сколько записей обновила команда UPDATE [tbl_Inspection]
13 янв 14, 15:12    [15408463]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
IFK
Glory
пропущено...

Если бы там была одна запись, то ошибки бы не было


Угу, но иногда почему-то получается не одна. Или подзапрос возврщает не одну. Почему - понять не могу. :(
Потому что документацию надо читать:
Using the inserted and deleted Tables
...
The deleted table stores copies of the affected rows during DELETE and UPDATE statements. During the execution of a DELETE or UPDATE statement, rows are deleted from the trigger table and transferred to the deleted table. The deleted table and the trigger table ordinarily have no rows in common.

The inserted table stores copies of the affected rows during INSERT and UPDATE statements. During an insert or update transaction, new rows are added to both the inserted table and the trigger table. The rows in the inserted table are copies of the new rows in the trigger table.

An update transaction is similar to a delete operation followed by an insert operation; the old rows are copied to the deleted table first, and then the new rows are copied to the trigger table and to the inserted table.
13 янв 14, 15:12    [15408464]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
	UPDATE a Set
	  db5_Score_Color_RLT=c.insp_Score_Color_Rep_New
	 ,db5_Score_M_T_RLT=c.insp_Score_Matur_Rep_New
	 ,db5_Score_B_S_RLT=c.insp_Score_Body_Rep_New
	 ,db5_Score_QltyM_RLT=c.insp_Score_QltyM_Rep_New
	 ,db5_Score_Total_RLT=c.insp_Score_Total_Rep_New 
	FROM tbl_DB5 AS a 
	  INNER JOIN  Inserted  as c ON c.IMID=a.db5_IMID 
	WHERE(a.db5_Sample in ('RPLS','RFLS'))


если сильно надо ,и уберите свою переменную толку от нее 0 + тип переменой у вас скорее всего не равен типу поля,врядли у вас ключи имеют тип varchar(max)
13 янв 14, 15:16    [15408485]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Maxx
	UPDATE a Set
	  db5_Score_Color_RLT=c.insp_Score_Color_Rep_New
	 ,db5_Score_M_T_RLT=c.insp_Score_Matur_Rep_New
	 ,db5_Score_B_S_RLT=c.insp_Score_Body_Rep_New
	 ,db5_Score_QltyM_RLT=c.insp_Score_QltyM_Rep_New
	 ,db5_Score_Total_RLT=c.insp_Score_Total_Rep_New 
	FROM tbl_DB5 AS a 
	  INNER JOIN  Inserted  as c ON c.IMID=a.db5_IMID 
	WHERE(a.db5_Sample in ('RPLS','RFLS'))


если сильно надо ,и уберите свою переменную толку от нее 0 + тип переменой у вас скорее всего не равен типу поля,врядли у вас ключи имеют тип varchar(max)


Результат тот же. Я пробовал через цикл, но та же фигня:
ALTER TRIGGER [dbo].[Trigger_Inspection_Scoring] 
   ON  [dbo].[tbl_Inspection] 
   AFTER UPDATE
AS	DECLARE @imid varchar(max)
	IF UPDATE(insp_Score_Total_Rep_New)
BEGIN
	SET NOCOUNT ON;
	DECLARE curs CURSOR LOCAL FORWARD_ONLY DYNAMIC
	FOR
		SELECT IMID
		FROM Inserted
	OPEN curs
	FETCH NEXT FROM curs INTO @imid
	WHILE @@FETCH_STATUS=0
	BEGIN
		UPDATE a Set db5_Score_Color_RLT=c.insp_Score_Color_Rep_New,db5_Score_M_T_RLT=c.insp_Score_Matur_Rep_New,db5_Score_B_S_RLT=c.insp_Score_Body_Rep_New,db5_Score_QltyM_RLT=c.insp_Score_QltyM_Rep_New,db5_Score_Total_RLT=c.insp_Score_Total_Rep_New 
		FROM tbl_DB5 AS a INNER JOIN (SELECT [insp_Score_Color_Rep_New],[insp_Score_Matur_Rep_New],[insp_Score_Body_Rep_New],[insp_Score_QltyM_Rep_New],[insp_Score_Total_Rep_New],IMID FROM Inserted WHERE(IMID=@imid)) as c ON c.IMID=a.db5_IMID WHERE(a.db5_Sample in ('RPLS','RFLS'))
	END
	CLOSE curs
	DEALLOCATE curs
13 янв 14, 15:29    [15408599]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Результат тот же. Я пробовал через цикл, но та же фигня:

Это не таже фигня. Это просто феерическая фигня.
13 янв 14, 15:34    [15408635]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
IFK,

ex, подниму себе карму немного

ALTER TRIGGER [dbo].[Trigger_Inspection_Scoring] 
   ON  [dbo].[tbl_Inspection] 
   AFTER UPDATE
AS	
IF UPDATE(insp_Score_Total_Rep_New)
	UPDATE a Set 
			db5_Score_Color_RLT = c.insp_Score_Color_Rep_New,
			db5_Score_M_T_RLT = c.insp_Score_Matur_Rep_New,
			db5_Score_B_S_RLT = c.insp_Score_Body_Rep_New,
			db5_Score_QltyM_RLT = c.insp_Score_QltyM_Rep_New,
			db5_Score_Total_RLT = c.insp_Score_Total_Rep_New 
		FROM tbl_DB5 AS a 
			INNER JOIN Inserted c ON c.IMID = a.db5_IMID 
		WHERE
			a.db5_Sample in ('RPLS','RFLS')
	
13 янв 14, 16:01    [15408873]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
WarAnt
IFK,

ex, подниму себе карму немного

ALTER TRIGGER [dbo].[Trigger_Inspection_Scoring] 
   ON  [dbo].[tbl_Inspection] 
   AFTER UPDATE
AS	
IF UPDATE(insp_Score_Total_Rep_New)
	UPDATE a Set 
			db5_Score_Color_RLT = c.insp_Score_Color_Rep_New,
			db5_Score_M_T_RLT = c.insp_Score_Matur_Rep_New,
			db5_Score_B_S_RLT = c.insp_Score_Body_Rep_New,
			db5_Score_QltyM_RLT = c.insp_Score_QltyM_Rep_New,
			db5_Score_Total_RLT = c.insp_Score_Total_Rep_New 
		FROM tbl_DB5 AS a 
			INNER JOIN Inserted c ON c.IMID = a.db5_IMID 
		WHERE
			a.db5_Sample in ('RPLS','RFLS')
	


в идеале нужно еще добавить это в условие and db5_Score_Total_RLT != c.insp_Score_Total_Rep_New, но это вам виднее
13 янв 14, 16:02    [15408888]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Дедушка Ау
Guest
IFK,

Using UPDATE with the FROM Clause
The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic. For example, in the UPDATE statement in the following script, both rows in Table1 meet the qualifications of the FROM clause in the UPDATE statement; but it is undefined which row from Table1 is used to update the row in Table2.

Так что где то тут надо смотреть:
FROM tbl_DB5 AS a INNER JOIN (SELECT [insp_Score_Color_Rep_New],[insp_Score_Matur_Rep_New],[insp_Score_Body_Rep_New],[insp_Score_QltyM_Rep_New],[insp_Score_Total_Rep_New],IMID FROM Inserted WHERE(IMID=@imid)) as c ON c.IMID=a.db5_IMID WHERE(a.db5_Sample in ('RPLS','RFLS'))
13 янв 14, 16:30    [15409120]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
WarAnt
WarAnt
IFK,

ex, подниму себе карму немного

ALTER TRIGGER [dbo].[Trigger_Inspection_Scoring] 
   ON  [dbo].[tbl_Inspection] 
   AFTER UPDATE
AS	
IF UPDATE(insp_Score_Total_Rep_New)
	UPDATE a Set 
			db5_Score_Color_RLT = c.insp_Score_Color_Rep_New,
			db5_Score_M_T_RLT = c.insp_Score_Matur_Rep_New,
			db5_Score_B_S_RLT = c.insp_Score_Body_Rep_New,
			db5_Score_QltyM_RLT = c.insp_Score_QltyM_Rep_New,
			db5_Score_Total_RLT = c.insp_Score_Total_Rep_New 
		FROM tbl_DB5 AS a 
			INNER JOIN Inserted c ON c.IMID = a.db5_IMID 
		WHERE
			a.db5_Sample in ('RPLS','RFLS')
	


в идеале нужно еще добавить это в условие and db5_Score_Total_RLT != c.insp_Score_Total_Rep_New, но это вам виднее


Увы, Ваша карма не поднялась... :(
13 янв 14, 16:52    [15409300]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
IFK
Увы, Ваша карма не поднялась... :(

неверю.... или Вы нам что-то нагло врете
13 янв 14, 16:54    [15409313]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Maxx
IFK
Увы, Ваша карма не поднялась... :(

неверю.... или Вы нам что-то нагло врете


Нахрена мне Вам врать, да еще и нагло? :(
Попробовал вот так:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Trigger_Inspection_Scoring] 
   ON  [dbo].[tbl_Inspection] 
   AFTER UPDATE
AS	DECLARE @imid varchar(max)
	IF UPDATE(insp_Score_Total_Rep_New)
BEGIN
	SET NOCOUNT ON;
	DECLARE @color decimal(5, 2), @m_t decimal(5, 2), @b_s decimal(5, 2), @qlty decimal(5, 2), @total decimal(5, 2)
	IF (SELECT Count(*) FROM Inserted)>1
	BEGIN
		DECLARE curs CURSOR LOCAL FORWARD_ONLY DYNAMIC
		FOR
			SELECT IMID
			FROM Inserted
		OPEN curs
		FETCH NEXT FROM curs INTO @imid
		WHILE @@FETCH_STATUS=0
		BEGIN
			Set @color=(SELECT insp_Score_Color_Rep_New FROM Inserted WHERE(IMID=@imid))
			Set @m_t=(SELECT insp_Score_Matur_Rep_New FROM Inserted WHERE(IMID=@imid))
			Set @b_s=(SELECT insp_Score_Body_Rep_New FROM Inserted WHERE(IMID=@imid))
			Set @qlty=(SELECT insp_Score_QltyM_Rep_New FROM Inserted WHERE(IMID=@imid))
			Set @total=(SELECT insp_Score_Total_Rep_New FROM Inserted WHERE(IMID=@imid))
			
			UPDATE tbl_DB5 Set 
				db5_Score_Color_RLT = @color,
				db5_Score_M_T_RLT = @m_t,
				db5_Score_B_S_RLT = @b_s,
				db5_Score_QltyM_RLT = @qlty,
				db5_Score_Total_RLT = @total 
			WHERE (db5_IMID=@imid and db5_Sample in ('RPLS','RFLS'))
		END
		CLOSE curs
		DEALLOCATE curs
	END
	ELSE
	BEGIN
		Set @color=(SELECT insp_Score_Color_Rep_New FROM Inserted WHERE(IMID=@imid))
		Set @m_t=(SELECT insp_Score_Matur_Rep_New FROM Inserted WHERE(IMID=@imid))
		Set @b_s=(SELECT insp_Score_Body_Rep_New FROM Inserted WHERE(IMID=@imid))
		Set @qlty=(SELECT insp_Score_QltyM_Rep_New FROM Inserted WHERE(IMID=@imid))
		Set @total=(SELECT insp_Score_Total_Rep_New FROM Inserted WHERE(IMID=@imid))
		UPDATE tbl_DB5 Set 
			db5_Score_Color_RLT = @color,
			db5_Score_M_T_RLT = @m_t,
			db5_Score_B_S_RLT = @b_s,
			db5_Score_QltyM_RLT = @qlty,
			db5_Score_Total_RLT = @total 
		WHERE (db5_IMID=@imid and db5_Sample in ('RPLS','RFLS'))
	END
END


Увы и ах, та же хрень. Теперь я вообще ничего не понимаю. :(
13 янв 14, 18:05    [15409769]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Нахрена мне Вам врать, да еще и нагло? :(

Потому что сообщение об ошибке содержит номер строки кода, вызвавщего ошибку.
Что вам мешает исправить код в этой строке - непонятно

ЗЫ
А проверка на число записей и курсор по inserted - это сразу премия наступившего года
13 янв 14, 18:10    [15409790]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
нафига там курсор ? Вам джойн написали еще 20 строк выше...
или у вас труктура таблиц не та4кая или оригинальное сообщение об ошибке...

ALTER TRIGGER [dbo].[Trigger_Inspection_Scoring] 
   ON  [dbo].[tbl_Inspection] 
   AFTER UPDATE
AS	
IF UPDATE(insp_Score_Total_Rep_New)
	UPDATE a Set 
			a.db5_Score_Color_RLT = c.insp_Score_Color_Rep_New,
			a.db5_Score_M_T_RLT = c.insp_Score_Matur_Rep_New,
			a.db5_Score_B_S_RLT = c.insp_Score_Body_Rep_New,
			a.db5_Score_QltyM_RLT = c.insp_Score_QltyM_Rep_New,
			a.db5_Score_Total_RLT = c.insp_Score_Total_Rep_New 
		FROM tbl_DB5 AS a 
			INNER JOIN Inserted c ON c.IMID = a.db5_IMID 
		WHERE
			a.db5_Sample in ('RPLS','RFLS')

Для вот такого варианта триггера
13 янв 14, 18:10    [15409791]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Дедушка Ау
Guest
IFK,

В инструкции UPDATE можно использовать имена переменных для показа старых и новых значений, но только в том случае, если инструкция UPDATE обрабатывает одну запись. Если инструкция UPDATE затрагивает несколько записей, для возврата старых и новых значений каждой записи используйте предложение OUTPUT.
(см. пункт "Рекомендации")

проверьте что на одну строку таблицы a не выдает 2 и более строки из которых производится апдэйт
просто скуль балдеет от попытки обновить одного поля поле одновременно 2-я значениями.
13 янв 14, 18:35    [15409895]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
IFK
Увы и ах, та же хрень. Теперь я вообще ничего не понимаю. :(
Вопрос на три балла: какого цвета учебник?
А Вы вообще уверены, что значения в поле IMID - уникальные?
Полный DDL таблицы (с констрэйнтами и индексами) показать не затруднитесь?
13 янв 14, 18:36    [15409898]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
IFK
Member

Откуда: Гондурас
Сообщений: 1034
Glory
IFK
Нахрена мне Вам врать, да еще и нагло? :(

Потому что сообщение об ошибке содержит номер строки кода, вызвавщего ошибку.
Что вам мешает исправить код в этой строке - непонятно

ЗЫ
А проверка на число записей и курсор по inserted - это сразу премия наступившего года


Нет сообщения об ошибке - просто не апдейтиться целевая таблица и все. Было бы сообщение - я бы не писал на форум.
Спасибо за премию, очень рад. Ничего другого не оставалось, кроме как идти в лоб. К сожалению, и этот вариант не прокатил.
13 янв 14, 18:57    [15410000]     Ответить | Цитировать Сообщить модератору
 Re: Update нескольких строк значениями из одной строки  [new]
Glory
Member

Откуда:
Сообщений: 104751
IFK
Нет сообщения об ошибке - просто не апдейтиться целевая таблица и все. Было бы сообщение - я бы не писал на форум.

Если нет сообщений об ошибке, то какая проблема то ?
Если ваши запросы ничего не делают, то перепишите их.

IFK
Спасибо за премию, очень рад. Ничего другого не оставалось, кроме как идти в лоб.

Это не в лоб. Это по лбу. Рукалицо.
13 янв 14, 21:51    [15410542]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить