Не удалось привязать составной идентификатор «S.clientid»

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».

Спасибо

пожалуйста, посмотрите stackoverflow.com/questions/19155775/… . Я думаю, вы не можете обновить столбец IDENTITY

Sergey 18.05.2024 13:51

речь идет не об обновлении столбца идентификаторов, мы можем справиться с этим с помощью Set Identity, но основная ошибка: «Невозможно привязать идентификатор, состоящий из нескольких частей».

SpiderPro 18.05.2024 14:06

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

NickW 18.05.2024 14:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта ошибка означает, что Master_Client_Update не известен запросу. Вы называете таблицу, которую хотите обновить, но не указываете источник данных, которые будут использоваться. Просто использовать имя таблицы в предложениях SET и WHERE — не лучший вариант.

Что касается ваших вариантов, у вас есть несколько:

  1. используйте 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;
  1. используйте 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;

Примечание:

Если в утверждениях должно быть несколько строк, которые могут быть источниками обновления, тогда результаты не определены, см. ответ после, как решить эту проблему.

Большое вам спасибо, ценю вашу помощь.

SpiderPro 19.05.2024 09:29

еще одна проблема: я обновляю 5 таблиц, одна из них (SurveyInformations), которую вы мне помогли сделать, и она работает нормально, теперь я обновляю остальные 4 таблицы, она не работает из-за строк * не то же самое в источнике (Master_Client_Update), одна таблица имеет 55 строк, а другая - 61 строку, а источник - 285 строк, я получил эту ошибку «Нарушение ограничения PRIMARY KEY 'PK_Complaints». Невозможно вставить повторяющийся ключ в объект 'dbo.Complaints' . Повторяющееся значение ключа: (21)». я хочу скопировать (id) источника в пункт назначения, даже если совпадений нет (client_id и сотрудник_id)..

SpiderPro 19.05.2024 11:23

Почему MERGE..? Кажется, нет смысла использовать здесь такую ​​необычную функцию.

Thom A 19.05.2024 11:38

что мне использовать для выполнения этой задачи?!

SpiderPro 19.05.2024 11:45

@SpiderPro «создавать строки в цели, когда они существуют в источнике?», просто добавьте предложение when not matched then insert (если вы используете MERGE). OTOH: Как отметил Thom A, я бы перефразировал это для этого конкретного случая: «Прочитайте документацию и в первую очередь поймите, что делают операторы»

Marty 20.05.2024 19:43

@ThomA спасибо за заметки (кстати, ваша ссылка не работает, она должна быть .org вместо .com) На ваш вопрос просто: по какой-то причине синтаксис мне нравится больше, чем UPDATE FROM; так что это сугубо личное. Прошло много времени с тех пор, как я занимался чем-то серьезным с SQL, поэтому признаю, что я не в курсе лучших практик; хотя, прочитав некоторые ссылки, которые вы упомянули, я бы не стал использовать слово quirky. Оно имеет свою специфику и нужно знать, при каких обстоятельствах его использовать. Немного обновлю ответ :)

Marty 20.05.2024 19:58

Другие вопросы по теме