codememo

'다중 부품 식별자'란 무엇이며 왜 바인딩할 수 없는가?

tipmemo 2023. 4. 8. 08:29
반응형

'다중 부품 식별자'란 무엇이며 왜 바인딩할 수 없는가?

다른 테이블을 기반으로 테이블을 업데이트하려고 하면 이러한 오류가 계속 발생합니다.결국 쿼리를 다시 작성하고 조인 순서를 변경하며 그룹화를 변경하며 결국 작동하게 됩니다. 하지만 잘 이해가 안 됩니다.

부품 란입니까?'중중중중중란란란란란란란란란란란란?
부품 를 수 다중 부품 식별자'를 바인딩할 수 없는 경우
건건어 쨌쨌 ?엇 엇?? ???
이에에 떤떤 ?우? ??? ???
그것을 예방하는 가장 좋은 방법은 무엇입니까?

SQL Server 2005에서 발생한 특정 오류는 다음과 같습니다.

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

다음은 예를 제시하겠습니다.

SELECT * FROM [MainDB].[dbo].[Company] 
WHERE [MainDB].[dbo].[Company].[CompanyName] = 'StackOverflow'

실제 오류:

Msg 4104, 레벨 16, 상태 1, 라인 2 멀티 파트 식별자 "MainDB.dbo"회사.CompanyName"을 바인딩할 수 없습니다.

멀티파트 식별자는 MyTable과 같은 여러 부분을 포함하는 필드 또는 테이블에 대한 설명입니다.SomeRow - 묶을 수 없는 것이 문제가 있는 경우 - 단순한 오타가 있거나 표와 열이 혼동됩니다.테이블 또는 필드 이름에 []로 둘러싸지 않고 예약된 단어를 사용하는 경우에도 발생할 수 있습니다.또한 대상 테이블에 모든 필수 열이 포함되지 않은 경우에도 발생할 수 있습니다.

redgate sql 프롬프트와 같은 것은 이러한 프롬프트를 수동으로 입력할 필요가 없어지지만(외부 키에 따라 자동 완성도 가능) 무료는 아닙니다.SQL Server 2008은 Redgate 버전만큼 완전하지는 않지만 즉시 인텔리센스를 지원합니다.

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

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

1의 열에는 다음 값이 없습니다.t1현행 한정자SomeField

지정함으로써 갱신을 시도하면 스테이트먼트에 의해 검출된 멀티 파트오류가 반환됩니다.

오타일 거예요.코드에서 [schema]를 호출하는 위치를 찾습니다.[TableName] (기본적으로 필드를 참조하는 곳)및 철자가 올바른지 확인합니다.

개인적으로는 모든 테이블에 별칭을 사용하여 이를 피하려고 합니다.긴 테이블 이름을 설명의 약자(WorkOrderParts -> WOP)로 단축할 수 있으면 매우 도움이 되며, 문의의 가독성도 향상됩니다.

편집: 추가 보너스로 스키마, 테이블 및 필드 이름을 모두 입력하지 않고 서너 글자의 별칭만 입력하면 엄청난 양의 키 입력을 절약할 수 있습니다.

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

멀티파트 식별자는 MyDatabase.dbo일 수 있습니다.마이테이블이러한 식별자 중 하나가 잘못되면 매핑할 수 없는 멀티파트 식별자가 있습니다.

이를 회피하는 가장 좋은 방법은 처음 쿼리를 올바르게 작성하거나 인텔리센스를 제공하는 관리 스튜디오용 플러그인을 사용하여 오타를 방지하는 것입니다.

다음과 같이 줄여서 말할 때 자주 볼 수 있습니다.

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

변경처:

Table1, Table2 
where Table1.ID = Table2.ID

쿼리를 실행하고 오류를 발생시키지 않도록 합니다.

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

Sales를 입력한 경우...고객님, 메시지를 받으셨을 수도 있습니다.

맞춤법에 의한 오타가 아니라고 확신한다면, 대소문자 오타가 아닐 수 있습니다.

어떤 대조법을 사용하시나요?확인해 보세요.

테이블을 업데이트할 때 별칭을 통해 업데이트할 필드를 참조하지 마십시오.

아래 코드에서 오류가 발생했습니다.

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

전면 Set 필드에 테이블 에일리어스를 추가하면 이 문제가 발생합니다.

맞다

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

틀렸어

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

이 문제가 있었는데 잘못된 테이블 별칭으로 판명되었습니다.이 문제를 수정하면 문제가 해결되었습니다.

나는 실수로 스키마를 Alias 테이블에 올려놓고 있었다.

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

는 ★★★★★★★★★★★★★★★★★★★★★★★★★.P.PayeeName AS 'Payer' --, 두 가 발생하였습니다.

다른 테이블에 앉는 걸 깜빡해서 오류가 난 거야

원래 이렇게 되어있어야 합니다.

  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)

에러 코드

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다음 줄에 오류가 발생했습니다.실제 이름 대신 선언된 이름을 사용합니다.문제는 해결됐습니다.

오류가 있을 때 가장 좋은 조언은 테이블 이름에 []브래킷을 사용하는 것입니다. 테이블의 약자로 인해 오류가 발생할 수 있습니다(때 테이블 약자로는 문제없이 작동합니다).이상하다)

이 에러가 발생하고 있어, 어디에 문제가 있는지 알 수 없었습니다.제 가명과 구문을 모두 다시 확인해봤는데 잘못된 건 하나도 없었어요그 질문은 내가 항상 쓰는 것과 비슷했다.

아래 (원래는 보고서 .rdl 파일에서 복사한) 쿼리를 다시 쓰기로 했습니다만, 정상적으로 동작했습니다.지금 질문들을 보면 똑같아 보이지만, 다시 쓴 것이 효과가 있습니다.

다른 방법이 없다면 시도해 볼 가치가 있을지도 모른다는 말을 하고 싶었어요.

FROM 테이블을 입력하면 이러한 오류가 사라집니다.입력한 것을 아래에 입력해 주세요.인텔리센스가 동작하고 멀티 부품 식별자가 동작합니다.

저는 이 문제에 직면하여 해결했습니다만, 당신의 코드와 제 코드에는 차이가 있습니다.단, "다중 부품 식별자를 바인딩할 수 없습니다"가 무엇인지 이해할 수 있다고 생각합니다.

이 코드를 사용했을 때

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

다중 부품 식별자 문제에 직면했습니다.

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

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

저도 같은 문제가 있었습니다만, 당신의 코딩과 마찬가지로 FROM 필드를 놓쳤습니다.FROM 필드가 추가되면 쿼리는 어떤 테이블에서 데이터를 읽어야 할 테이블을 알 수 있습니다.

SUBSTRING 방식으로 대괄호를 제거한 후 광산이 작동하였습니다.나는 에서 바뀌었다.

서브스트링([dbo.table])[컬럼], 15, 2)

로.

서브스트링(dbo.table.column, 15,2)

CTRL+SHIFT+R(Intelisense 갱신)로 처리했습니다.

언급URL : https://stackoverflow.com/questions/206558/what-is-a-multi-part-identifier-and-why-cant-it-be-bound

반응형