'멀티 파트 식별자'란 무엇이며 바인딩 할 수없는 이유는 무엇입니까?


137

다른 테이블을 기반으로 테이블을 업데이트하려고 할 때 이러한 오류가 계속 발생합니다. 쿼리를 다시 작성하고 조인 순서를 변경하고 일부 그룹을 변경하면 결국 작동하지만 결국에는 얻지 못합니다.

'멀티 파트 식별자'란 무엇입니까?
'멀티 파트 식별자'는 언제 바인딩 될 수 없습니까?
어쨌든 무엇에 묶여 있습니까?
어떤 경우에이 오류가 발생합니까?
그것을 예방하는 가장 좋은 방법은 무엇입니까?

SQL Server 2005의 특정 오류는 다음과 같습니다.

다중 부품 식별자 "..."을 (를) 바인딩 할 수 없습니다.

예를 들면 다음과 같습니다.

UPDATE  [test].[dbo].[CompanyDetail]

SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], 
               [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]

WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

실제 오류 :

메시지 4104, 수준 16, 상태 1, 줄 3 다중 부분 식별자 "dbBWKMigration.dbo.Company.COMPANYNAME"을 바인딩 할 수 없습니다.

답변:


101

멀티 파트 식별자는 여러 부분을 포함하는 필드 또는 테이블에 대한 설명입니다 (예 : MyTable.SomeRow). 바인딩 할 수없는 경우, 무언가 잘못되었음을 의미합니다. 간단한 오타가 있거나 테이블과 열. 테이블 또는 필드 이름에 예약어를 사용하고 []로 묶지 않아서 발생할 수도 있습니다. 목표 테이블에 모든 필수 열을 포함하지 않아서 발생할 수도 있습니다.

redgate sql prompt 와 같은 것은 수동으로 입력하지 않아도되므로 훌륭하지만 외래 키를 기반으로 한 조인 자동 완성조차도 무료는 아닙니다. SQL Server 2008은 인텔리전스를 즉시 지원하지만 레드 게이트 버전만큼 완벽하지는 않습니다.


6
여전히 실제 : 오타 힌트가 내 하루를 구했습니다.
Stefan

초보자를위한 일일 보호기 의견 : 오타를 확인하십시오. 때로는 작은 조각이 없을 때 발생합니다. 내 문제에서는 50 줄 이상의 쿼리에서 따옴표가없는 OBJECT_ID (Schema.Table)였습니다.
압둘라 일 가즈

57

실제로 때로는 다른 테이블의 데이터에서 하나의 테이블을 업데이트 할 때이 오류를 일으키는 일반적인 문제 중 하나는 테이블 약어를 잘못 사용 하거나 필요하지 않은 경우 입니다. 올바른 진술은 다음과 같습니다.

Update Table1
Set SomeField = t2.SomeFieldValue 
From Table1 t1 
Inner Join Table2 as t2
    On t1.ID = t2.ID

SomeField에서 열 표가 없습니다 t1로 규정 t1.SomeField하지만, 단지입니다 SomeField.

t1.SomeField문 을 지정 하여 업데이트하려고하면 발견 한 다중 부분 오류가 반환됩니다.


3
Set 필드 앞에 테이블 별칭을 추가하면이 문제가 발생합니다.
Malhaar Punjabi

1
이것은 나의 문제이기도했다. ABBREVIATION.My_Field방금 필요할 때 SET이있었습니다 SET.My_Field.
VSO

OPENJSON을 사용하는 동안이 오류가 발생했습니다. `외부 응용 프로그램 OPENJSON (cust.Addresses)에서`오류가 발생했습니다. `cust c 외부 응용 OPENJSON (c. 주소)에서``결과를 돌려
주다

sqlservertutorial.net/sql-server-basics/sql-server-update-join 에서 설명이 도움 이 될 수 있습니다 .
CAtoOH

17

아마 오타 일 것입니다. 코드에서 [schema]. [TableName] (기본적으로 필드를 참조하는 곳)이라고 부르는 곳을 찾아서 철자가 올바른지 확인하십시오.

개인적으로 모든 테이블에 별칭을 사용하여이를 피하려고합니다. 긴 테이블 이름을 설명의 약어 (예 : WorkOrderParts-> WOP)로 단축하고 쿼리를보다 읽기 쉽게 만들 수있을 때 크게 도움이됩니다.

편집 : 추가 보너스로 입력 해야하는 모든 것이 3 자 또는 4 자의 별칭 대 스키마, 테이블 및 필드 이름 모두 인 경우 키 입력의 톤을 절약 할 수 있습니다.


6

바인딩 = 특정 열의 텍스트 표현은 일부 테이블, 일부 데이터베이스, 일부 서버의 실제 열에 매핑됩니다.

다중 부분 식별자는 MyDatabase.dbo.MyTable입니다. 이러한 식별자 중 하나라도 잘못되면 매핑 할 수없는 다중 부분 식별자가 있습니다.

이를 피하는 가장 좋은 방법은 바로 쿼리를 작성하거나 인텔리전스를 제공하고 오타를 피함으로써 도움을주는 관리 스튜디오 용 플러그인을 사용하는 것입니다.


5

아마도 오타가있을 것입니다. 예를 들어, Sales라는 데이터베이스에 Customer라는 테이블이있는 경우 Sales..Customer로 참조 할 수 있습니다 (Sales.dbo와 같은 소유자 이름 (dbo는 기본 소유자 임)을 포함하여 참조하는 것이 좋습니다. .고객.

Sales ... Customer를 입력 한 경우받은 메시지가 표시되었을 수 있습니다.


4

오타 철자가 아닌 것이 확실하다면, 아마도 오타 일 수도 있습니다.

어떤 데이터 정렬을 사용하고 있습니까? 확인해 봐.


4

테이블을 업데이트 할 때 별칭을 통해 업데이트 필드를 참조하지 않아야합니다.

방금 다음 코드에서 오류가 발생했습니다.

update [page] 
set p.pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

set 문에서 별칭 참조를 제거해야하므로 다음과 같이 읽습니다.

update [page] 
set pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

4

나는 다음과 같이 약어를 쓰려고 할 때 이것들을 많이 얻는다는 것을 알았습니다.

Table1 t1, Table2 t2 
where t1.ID = t2.ID

로 변경 :

Table1, Table2 
where Table1.ID = Table2.ID

쿼리를 작동시키고 오류를 발생시키지 않습니다.


3

에러 코드

FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID =dbo.SubModule.subModuleID 

솔루션 코드

 FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID = SM.subModuleID 

보시다시피 오류 코드에서 dbo.SubModule이미 SM으로 정의되어 있지만 dbo.SubModule다음 줄에서 사용 하고 있으므로 오류가 발생했습니다. 실제 이름 대신 선언 된 이름을 사용하십시오. 문제 해결됨.


2

이 문제가 발생하여 테이블 별칭이 잘못되었습니다. 이 문제를 해결하면 문제가 해결되었습니다.


2

광산은 실수로 테이블 별칭에 스키마를 넣었습니다.

SELECT * FROM schema.CustomerOrders co
WHERE schema.co.ID = 1  -- oops!

2

Set 필드 앞에 테이블 별칭을 추가하면이 문제가 발생합니다.

올바른 업데이트 Table1 Table1에서 SomeField = t2.SomeFieldValue 설정 t1 내부 조인 Table2를 t2로 t1.ID = t2.ID

잘못된 업데이트 Table1 설정 t1.SomeField = t2. Table1의 SomeFieldValue t1 내부 조인 Table2를 t2로 t1.ID = t2.ID


1

나는 가지고 있었고 P.PayeeName AS 'Payer' --, 두 개의 주석 줄은이 오류를 던졌습니다.


1

나는 실제로 다른 사람들과 테이블을 조인하는 것을 잊어 버렸습니다.

이 방법으로 가정 :

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation, dbo.Flight
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum =562)

그리고이 방법이 아닙니다 :

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum = 562)

1

오류가 발생했을 때 가장 좋은 조언은 [] 괄호를 사용하여 테이블 이름을 바꾸는 것입니다.


1

이 오류가 발생하여 문제의 위치를 ​​볼 수 없었습니다. 모든 별칭과 구문을 두 번 확인했지만 제대로 보이지 않았습니다. 쿼리는 항상 쓰는 것과 비슷했습니다.

아래에서 쿼리를 다시 작성하기로 결정했습니다 (원래 보고서 .rdl 파일에서 복사했습니다). 지금 쿼리를 보면 그들은 나에게 동일하게 보이지만 다시 작성된 것이 작동합니다.

아무것도 작동하지 않으면 촬영할 가치가 있다고 말하고 싶었습니다.


1

FROM 테이블을 입력하면 해당 오류가 사라집니다. 입력 내용 아래에 FROM을 입력하면 Intellisense가 작동하고 다중 부품 식별자가 작동합니다.


0

이 문제에 직면하여 해결했지만 귀하의 코드와 광산 코드에는 차이가 있습니다. "여러 부분 식별자를 바인딩 할 수 없습니다"가 무엇인지 이해할 수 있다고 생각합니다.

이 코드를 사용할 때

 select * from tbTest where email = sakira@gmail.com

멀티 파트 식별자 문제에 직면했습니다

하지만 이메일 주소에 작은 따옴표를 사용하면 해결되었습니다.

 select * from tbTest where email = 'sakira@gmail.com'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.