Ошибка не удалось привязать составной идентификатор

More than likely your issue is that you are logged in using a database user whose default schema is different than the schema of the table from which you are selecting (or has no default schema).

For example: Say you have 2 schemas in your database, dbo and reports. Your database user was setup with a default schema of dbo. If you have a table in a reports schema reports.table1, and there is not a synonym in the dbo schema for dbo.table1 that points to reports.table1, then you will get this error if you do not specify the schema when selecting the field name.

NOTE: this appears to work in SQL 2008 R2, but when I tested in SQL 2005 then I received the error:

Msg 4104, Level 16, State 1, Line 1 The multi-part identifier
«TestTable.TestField» could not be bound.

You can check the default schema for your user by using this query:

select p.name, p.default_schema_name 
from sys.database_principals p 
order by p.name

A way to get around this is by using table alias’ in your query, or to specify the full path to the table as you mentioned in OP.

select t.[FieldName] 
from [SchemaName].[TableName] as t

YoHnA

0 / 0 / 0

Регистрация: 31.08.2015

Сообщений: 47

1

Составной идентификатор

04.10.2016, 15:42. Показов 7117. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Доброго времени суток.

Я все еще нуб в MSSQL.

Есть таблица SF, в ней столбец Stage, в котором лежат текстовые данные. Они постоянно повторяются, так что было решено сделать по ним справочник Stage — ID и, собственно, Stage. Справочник был составлен при помощи группировки столбца Stage из SF, т.е. несовпадения исключены.
Далее хочу заменить в SF значения в Stage на их айдишники из справочника Stage

T-SQL
1
update dbo.SF set dbo.SF.Stage=dbo.Stage.ID where dbo.SF.Stage=dbo.Stage.Stage

Пишет «Не удалось привязать составной идентификатор «dbo.Stage.Stage»»
Пробовала переформатировать Stage.ID из инта в нварчар, не помогло, ошибка та же.
Таблицы никак не связаны, и в первой, и во второй ключевое поле ID, не составное.
Помогите, пожалуйста.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

04.10.2016, 15:42

2

iap

1109 / 754 / 182

Регистрация: 27.11.2009

Сообщений: 2,252

04.10.2016, 15:55

2

Лучший ответ Сообщение было отмечено YoHnA как решение

Решение

YoHnA, таблицы определяются во FROMе. Только для той, которую апдейтите, FROM необязателен.
Хотя, удобно назначить ей алиас, а это тоже только во FROMе делать надо.
Следите за руками:

T-SQL
1
2
3
4
UPDATE F
SET F.Stage=S.ID
FROM dbo.SF F
JOIN dbo.Stage S ON F.Stage=S.Stage;

Однако, я не понял, какого типа dbo.SF.Stage и dbo.Stage.ID?
Зачем смешивать строковый тип и числовой?
В dbo.SF тоже надо создать числовое поле, например, StageID, и заполнить его UPDATEом.
А dbo.SF.Stage не трогать (или вообще удалить)

P.S. Что вы называете «составным идентификатором» в названии темы?



1



0 / 0 / 0

Регистрация: 31.08.2015

Сообщений: 47

04.10.2016, 16:05

 [ТС]

3

Цитата
Сообщение от iap
Посмотреть сообщение

Однако, я не понял, какого типа dbo.SF.Stage и dbo.Stage.ID?

nvarchar и int соответственно. Ничего не смешивала, просто тыкала пальцем в небо наугад.

Цитата
Сообщение от iap
Посмотреть сообщение

В dbo.SF тоже надо создать числовое поле, например, StageID, и заполнить его UPDATEом.
А dbo.SF.Stage не трогать (или вообще удалить)

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

Спасибо! Раньше ни разу не доводилось использовать from в апдейте.



0



Необходимо написать хранимую процедуру, которая увеличивает комиссионные у тех продавцов, сумма продаж которых превышает среднюю сумму продаж всей компании. В написанной мной процедуре отображается ошибка (Не удалось привязать составной идентификатор «a.sum_zakaz».)
Помогите пожалуйста разобраться, что является причиной данной ошибки?
Скрипт:

create procedure comis_plus
@value decimal
as
update prodavec 
set comis_prod=comis_prod+@value
where avg(a.sum_zakaz)<(select sum(a.sum_zakaz)
                        from zakaz a, prodavec b
                        where a.id_prod=b.id_prod)

Kromster's user avatar

Kromster

13.6k12 золотых знаков43 серебряных знака72 бронзовых знака

задан 15 окт 2020 в 21:26

user393275's user avatar

Так сделайте, у вас обновляется продавец но нет условий на фильтрацию с этой таблицей

create procedure comis_plus
@value decimal
@avgsum decimal
as
-- вычислите среднюю сумму продаж всей компании
SELECT @avgsum = avg(sum_zakaz) FROM zakaz

-- далее имея значение можно не извращяться запросами

update zakaz 
set comis_prod=zakaz.comis_prod+@value
where zakaz.id_prod in (select a.id_prod
                        from zakaz a, prodavec b
                        where a.id_prod=b.id_prod
                        GROUP BY a.id_prod
                        having @avgsum < sum(a.sum_zakaz)                      
                        )

UPD.Изменил процедуру добавил коментариев

ответ дан 16 окт 2020 в 5:30

Aziz Umarov's user avatar

Aziz UmarovAziz Umarov

22.4k2 золотых знака10 серебряных знаков32 бронзовых знака

4

Мне кажется — я не проверял — что поменять надо вот что:

    where avg(zakaz.sum_zakaz)<(select sum(a.sum_zakaz)
                            from zakaz a, prodavec b
                            where a.id_prod=b.id_prod)

То есть, синоним a для zakaz относится только к выражению в скобках

ответ дан 15 окт 2020 в 22:17

S.H.'s user avatar

S.H.S.H.

10.8k1 золотой знак19 серебряных знаков40 бронзовых знаков

5

MSSQL Как исправить ошибку Не удалось связать составной идентификатор

Я видел похожие ошибки на SO, но не нашел решения своей проблемы. У меня есть такой SQL-запрос:

SELECT DISTINCT a.maxa , b.mahuyen , a.tenxa , b.tenhuyen , ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a , quanhuyen b LEFT OUTER JOIN ( SELECT maxa , COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa <> '99' AND LEFT(a.maxa, 2) = b.mahuyen ORDER BY maxa; 

Когда я выполняю этот запрос, результат ошибки: Не удалось связать составной идентификатор «a.maxa». Зачем? P / s: если я разделю запрос на 2 отдельных запроса, он будет работать нормально.

SELECT DISTINCT a.maxa , b.mahuyen , a.tenxa , b.tenhuyen FROM phuongxa a , quanhuyen b WHERE a.maxa <> '99' AND LEFT(a.maxa, 2) = b.mahuyen ORDER BY maxa; 

а также

SELECT maxa , COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa; 

  • Есть ли phuongxa таблица включает столбец maxa?
  • 1 Что произойдет, если вы добавите группу maxa, tang — сразу после 5 сентября 2011 года.
  • Да, было. Если я разделю запрос на 2 подзапроса, он будет работать нормально
  • Похоже, вы выполняете не ту базу данных. Добавьте оператор «USE [имя базы данных]» в начало запроса и посмотрите, по-прежнему ли вы получаете ошибку.
  • 1 Нет, как я сказал выше, если я разделю запрос на 2 отдельных запроса, он выполнится нормально.

Вы смешиваете неявные соединения с явными соединениями. Это разрешено, но вы должны знать, как это делать правильно.

Дело в том, что явные объединения (те, которые реализованы с использованием JOIN ключевое слово) имеют приоритет над неявными (объединение «запятая», где условие объединения указано в WHERE пункт).

Вот краткое описание вашего запроса:

SELECT … FROM a, b LEFT JOIN dkcd ON … WHERE … 

Вы, вероятно, ожидаете, что он будет вести себя так:

SELECT … FROM (a, b) LEFT JOIN dkcd ON … WHERE … 

то есть комбинация таблиц a а также b соединяется со столом dkcd. На самом деле то, что происходит,

SELECT … FROM a, (b LEFT JOIN dkcd ON …) WHERE … 

то есть, как вы, возможно, уже поняли, dkcd присоединяется специально против b и только b, то результат соединения объединяется с a и отфильтровали дальше с WHERE пункт. В этом случае любая ссылка на a в ON пункт недействителен, a неизвестно на тот момент. Вот почему вы получаете сообщение об ошибке.

На вашем месте я, вероятно, попытался бы переписать этот запрос, и одним из возможных решений могло бы быть:

SELECT DISTINCT a.maxa, b.mahuyen, a.tenxa, b.tenhuyen, ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa a INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen LEFT OUTER JOIN ( SELECT maxa, COUNT(*) AS tong FROM khaosat WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY maxa ) AS dkcd ON dkcd.maxa = a.maxa WHERE a.maxa <> '99' ORDER BY a.maxa 

Здесь таблицы a а также b сначала соединяются, затем результат соединяется с dkcd. По сути, это тот же запрос, что и ваш, только с использованием другого синтаксиса для одного из объединений, что имеет большое значение: ссылка a.maxa в dkcdТеперь условие соединения абсолютно корректно.

Как правильно заметил @Aaron Bertrand, вам, вероятно, следует подходить maxa с определенным псевдонимом, возможно a, в ORDER BY пункт.

  • ORDER BY maxa все еще неоднозначен, не так ли? Также я был бы осторожен с датой «1 сентября 2011 года», она не будет работать с другими языковыми / региональными настройками.
  • @Aaron: Согласен по поводу ORDER BY maxa, Благодарность. Что касается дат, я считаю, что именно так OP решил указать их в своей среде.
  • «явные соединения … имеют приоритет над неявными» — не могли бы вы процитировать это, пожалуйста? например это определено в стандартах SQL или это особенность продукта? Спасибо.
  • 1 @onedaywhen: Боюсь, это пока не более чем наблюдение с моей стороны. Меня несколько успокаивает тот факт, что я не первый, кто говорит здесь о приоритете объединений, но кроме этого, я был бы рад сам найти какое-либо официальное подтверждение.
  • 1 В моем случае я забыл поставить пробелы при объединении строк для построения sql, поэтому ‘FROM dbo.table_a a’ + ‘INNER JOIN dbo.table_b b’ стало ‘FROM dbo.table_a aINNER JOIN dbo.table_b b’ , и он запутался и дал мне это сообщение об ошибке. Подробности, подробности, подробности.

Иногда эта ошибка возникает, когда вы неправильно используете схему (dbo) в запросе.

например, если вы напишете:

select dbo.prd.name from dbo.product prd 

вы получите ошибку.

В этой ситуации измените его на:

select prd.name from dbo.product prd 
  • 1 Это довольно раздражает, и мне потребовалось слишком много времени, чтобы понять это. Спасибо. Самая неприятная часть — иногда он придирается к этому, но иногда проходит нормально.

если вы дали имя союзникам, измените его на настоящее имя

например

SELECT A.name,A.date FROM [LoginInfo].[dbo].[TableA] as A join [LoginInfo].[dbo].[TableA] as B on [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name; 

измените это на

SELECT A.name,A.date FROM [LoginInfo].[dbo].[TableA] as A join [LoginInfo].[dbo].[TableA] as B on A.name=B.name; 
  • 1 Также, если вы создаете строку sql, следите за отсутствием конечных пробелов в конце строки. Он преобразовал мой псевдоним M в MINNER, когда он присоединился к следующей строке INNER JOIN ниже. Профилировщик SQL, показывающий выполненную строку, помог решить мою проблему. (Прокомментировано здесь, поскольку это связано с проблемой псевдонима v с фактическим именем)
  • вау @Simon, спасибо, я даже не подумал об этом и бился головой о стену, пытаясь понять, почему мой запрос не работал, мне не хватало пробела в конце одного из символов возврата каретки!
  • Это решило проблему, спасибо!

Я боролся с тем же сообщением об ошибке в SQL SERVER, так как у меня было несколько объединений, меняя порядок соединений решил это за меня.

В моем случае проблема оказалась в псевдониме, который я дал таблице. «oa» кажется неприемлемым для SQL Server.

У меня была такая же ошибка от JDBC. Все проверил, и мой запрос был в порядке. Оказалось, в предложении where у меня есть аргумент:

where s.some_column = ? 

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

Что сработало для меня, так это изменить мое предложение WHERE на подзапрос SELECT

ИЗ:

 DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId 

Кому:

 DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData) 

Я новичок в SQL, но столкнулся с этой проблемой в ходе прохождения курса и обнаружил, что назначение запроса проекту специально помогло устранить ошибку, состоящую из нескольких частей. Например, созданный мной проект был CTU SQL Project, поэтому я убедился, что я начал свой скрипт с USE [CTU SQL Project] в качестве первой строки, как показано ниже.

USE [CTU SQL Project] SELECT Advisors.First_Name, Advisors.Last_Name...and so on. 
  • 1 Когда вы говорите «проект», я предполагаю, что вы имеете в виду базу данных, а не проекцию. Оператор use просто изменяет базу данных, на которую вы накладываете запрос.
  • Да, проект Charleh, как в базе данных, над которой я работал. Я не был уверен, что я делал не так с моей базой данных, но указание «использовать» и конкретную базу данных для области действия устранило мою ошибку.

Если эта ошибка возникает в UPDATE, дважды проверьте JOIN в таблице со столбцом / полем, вызывающим ошибку.

В моем случае это было из-за отсутствия JOIN сам, который генерировал ту же ошибку из-за неизвестного поля (как указал Андрей).

Вместо этого вы можете попробовать объединить такие таблицы, как,

select .... from dkcd right join a , b 

Это должно работать

SELECT DISTINCT phuongxa.maxa , quanhuyen.mahuyen , phuongxa.tenxa , quanhuyen.tenhuyen , ISNULL(dkcd.tong, 0) AS tongdkcd FROM phuongxa , quanhuyen LEFT OUTER JOIN ( SELECT khaosat.maxa , COUNT(*) AS tong FROM khaosat WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011' GROUP BY khaosat.maxa ) AS dkcd ON dkcd.maxa = maxa WHERE phuongxa.maxa <> '99' AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen ORDER BY maxa; 
  • Используйте сами имена таблиц вместо псевдонимов, если возникает проблема с привязкой к нескольким частям.

Моя ошибка заключалась в использовании поля, которого не было в таблице.

table1.field1 => не существует

table2.field1 => правильно

Исправьте имя вашей таблицы.

моя ошибка произошла из-за использования WITH

WITH RCTE AS ( SELECT... ) SELECT RCTE.Name, ... FROM RCTE INNER JOIN Customer ON RCTE.CustomerID = Customer.ID 

при использовании в сочетании с другими таблицами …

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

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

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

use somedatabase go select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram, o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o inner join patient p on o.operationid = p.operationid left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid left outer join theater t on t.theaterid = o.theaterid where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%') 

Во-первых: выполните внутренние соединения между таблицами, которые, как вы ожидаете, будут соответствовать данным. Вторая часть: продолжайте внешние соединения, чтобы попытаться получить данные из других таблиц, но это не отфильтрует ваш набор результатов, если внешнее соединение таблицы не имеет соответствующих данных или не соответствует условию, которое вы установили в предикате / условии on.

Эта ошибка также может быть вызвана просто отсутствием запятой. , между именами столбцов в операторе SELECT.

например:

SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable; 
  • Если SELECT MyCol1, MyCol2, MyCol3 FROM SomeTable; работает, то я не понимаю, как SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable; могу дать вам любой ошибка, не говоря уже о той, что в заголовке этого вопроса. Если в вашем примере есть что-то, что бросается в глаза, в этом случае я предполагаю, что это не будет просто отсутствует запятая. Как вы думаете, можно ли придумать простой сценарий, воспроизводящий проблему, о которой вы говорите? Вот где я попытался просто опустить запятую, но это все равно сработало (= ошибки не было): dbfiddle.uk/…
  • @AndriyM Единственное, о чем я могу думать, это то, что мой запрос, вероятно, был более сложным (возможно, с соединениями, извините, давным-давно). Но я уверен, что исправление для сообщения об ошибке, которое я получил (которое могло или не могло быть точно как в заголовке OP) нужно было просто поставить пропущенную запятую!

Tweet

Share

Link

Plus

Send

Send

Pin

Показывать по
10
20
40
сообщений

Новая тема

Ответить

SirStefan

Дата регистрации: 19.04.2010
Сообщений: 9

1C 8.2.10.82 УПП 1.3.2.1 SQL<br><br>При стандартной процедуре удаления помеченных объектов конфигуратор падает с ошибкой «Ошибка СУБД:Microsoft OLE DB Provider for SQL Server: Не удалось привязать составной идентификатор «T74._Fld3679RRef». HRESULT=80040E14, SQLSrvr: SQLSTATE=42000, state=1, Severity=10, native=4104, line=1″<br><br>тестирование/исправление не помогает<br>выгрузка/загрузка не помогает<br>chdbfl не находит никаких ошибок<br>выгрузка и работа в файловой базе не помогает — так же падает<br>все вышеуказанное в файловой базе так же не помогает.<br><br>Что можно сделать? Чем проверить и пролечить базу?

roger677

Дата регистрации: 09.02.2009
Сообщений: 56

>все вышеуказанное в файловой базе так же не помогает.<br>если выгрузить в файловую и начать удаление помеченных объектов выходит ошибка SQL Server???<br><br>на ИТС есть обработка «Удаление помеченных объектов» попробуйте ею воспользоваться. Поставьте еще в конфигураторе галочку «Останавливаться по ошибке» — узнаете в каком именно объекте дело<br>

SirStefan

Дата регистрации: 19.04.2010
Сообщений: 9

«Ошибка в файловой: Ошибка СУБД: Ошибка SQL: Поле не найдено ‘T74._Fld3679RRef'<br>База просто падает с этой ошибкой. Никакая остановка по ошибке не отрабатывает (Эту обработку я уже тоже пробовал), хотя на чем сыпется я и так знаю: «ТаблицаСсылок = НайтиПоСсылкам(МассивКУдалению);». Вот только что делать в данном случае — непонятно.<br><br>P.S. Падает на Справочник.Номенклатура. Но только при полном списке. Делил список на три части и каждую пытался удалять отдельно (они не удаляются, есть ссылки) — все проходит, ссылки ищутся. А вот вместе — уже нет :(«

Gars

Дата регистрации: 28.05.2007
Сообщений: 207

У меня была похожая ошибка, лечится включением в конфигураторе в свойствах задачи совместимости с версией 8.1. Это ошибка платформы признанная разработчиками (по крайней мере по словам франча). Возникает при обновлении конвертированных версий УПП 8.1 на релизы обновлений специально подготовленные для 8.2. Можно обойти ошибку без включения возможности редактирования конфиги, если количество помеченных на удаление объектов не будет превышать 128-ми.<br>Это не претендует на истину, но я так выкручивался…<br>http://www.forum.mista.ru/topic.php?id=464044

SirStefan

Дата регистрации: 19.04.2010
Сообщений: 9

Спасибо огромное. А то задолбался уже решение искать.

Показывать по
10
20
40
сообщений

Читают тему:

Понравилась статья? Поделить с друзьями:
  • Ошибка не удалось правильно определить размер диска
  • Ошибка не удалось построить цепочку сертификатов
  • Ошибка не удалось подключиться к серверу io netty channel
  • Ошибка не удалось построить цепочку доверия код 1300
  • Ошибка не удалось подключиться к серверу destiny 2