SET IDENTITY_INSERT SurveyInformations ON
UPDATE SurveyInformations
SET SurveyInformations.id = Master_Client_Update.id
WHERE Master_Client_Update.Client_Id = SurveyInformations.clientid
AND Master_Client_Update.emp_id = SurveyInformations.EmployeeId
SET IDENTITY_INSERT SurveyInformations OFF
Я пытаюсь скопировать значения из столбца id таблицы (master_client_update) в столбец id таблицы SurveyInformations.
Но я получаю эти ошибки:
Сообщение 4104, уровень 16, состояние 1, строка 18
Не удалось привязать составной идентификатор «Master_Client_Update.Client_Id».Сообщение 4104, уровень 16, состояние 1, строка 18
Не удалось привязать составной идентификатор «Master_Client_Update.emp_id».
Спасибо
речь идет не об обновлении столбца идентификаторов, мы можем справиться с этим с помощью Set Identity, но основная ошибка: «Невозможно привязать идентификатор, состоящий из нескольких частей».
Пожалуйста, обновите свой вопрос, указав полный DDL для обеих таблиц, включая любые индексы/ограничения.





Эта ошибка означает, что Master_Client_Update не известен запросу. Вы называете таблицу, которую хотите обновить, но не указываете источник данных, которые будут использоваться. Просто использовать имя таблицы в предложениях SET и WHERE — не лучший вариант.
Что касается ваших вариантов, у вас есть несколько:
UPDATE FROM — если будут нужны только обновления, это может быть лучшим вариантом:UPDATE t
SET t.id = s.id
FROM SurveyInformations AS t
INNER JOIN Master_Client_Update AS s
ON s.Client_Id=t.clientid AND s.emp_id=t.EmployeeId;
MERGE — это может оказаться ненужным, если единственное, что вы делаете — это обновление строк, но если случайно вы захотите также вставить новые строки, этот вариант предлагает краткий способ записи — имейте в виду, что вы должны знать, что такое возможные осложнения (но это справедливо даже для варианта 1 – см. примечание ниже):merge SurveyInformations as t
using (select * from Master_Client_Update) as s
on s.Client_Id=t.clientid AND s.emp_id=t.EmployeeId
when matched then
update
set id = s.id;
Примечание:
Если в утверждениях должно быть несколько строк, которые могут быть источниками обновления, тогда результаты не определены, см. ответ после, как решить эту проблему.
Большое вам спасибо, ценю вашу помощь.
еще одна проблема: я обновляю 5 таблиц, одна из них (SurveyInformations), которую вы мне помогли сделать, и она работает нормально, теперь я обновляю остальные 4 таблицы, она не работает из-за строк * не то же самое в источнике (Master_Client_Update), одна таблица имеет 55 строк, а другая - 61 строку, а источник - 285 строк, я получил эту ошибку «Нарушение ограничения PRIMARY KEY 'PK_Complaints». Невозможно вставить повторяющийся ключ в объект 'dbo.Complaints' . Повторяющееся значение ключа: (21)». я хочу скопировать (id) источника в пункт назначения, даже если совпадений нет (client_id и сотрудник_id)..
Почему MERGE..? Кажется, нет смысла использовать здесь такую необычную функцию.
что мне использовать для выполнения этой задачи?!
@SpiderPro «создавать строки в цели, когда они существуют в источнике?», просто добавьте предложение when not matched then insert (если вы используете MERGE). OTOH: Как отметил Thom A, я бы перефразировал это для этого конкретного случая: «Прочитайте документацию и в первую очередь поймите, что делают операторы»
@ThomA спасибо за заметки (кстати, ваша ссылка не работает, она должна быть .org вместо .com) На ваш вопрос просто: по какой-то причине синтаксис мне нравится больше, чем UPDATE FROM; так что это сугубо личное. Прошло много времени с тех пор, как я занимался чем-то серьезным с SQL, поэтому признаю, что я не в курсе лучших практик; хотя, прочитав некоторые ссылки, которые вы упомянули, я бы не стал использовать слово quirky. Оно имеет свою специфику и нужно знать, при каких обстоятельствах его использовать. Немного обновлю ответ :)
пожалуйста, посмотрите stackoverflow.com/questions/19155775/… . Я думаю, вы не можете обновить столбец IDENTITY