복붙노트

[SQL] 무엇 '다중 부분 식별자'이며 왜이 바인딩 할 수 없습니다?

SQL

무엇 '다중 부분 식별자'이며 왜이 바인딩 할 수 없습니다?

내가 다른 테이블을 기반으로 테이블을 업데이트하려고 할 때 나는 지속적으로 이러한 오류를 얻을. 나는 쿼리를 다시 작성 결국 조인의 순서를 변경, 일부 그룹을 변경 한 후 결국 작동하지만, 난 그냥 아주 그것을 얻을하지 않습니다.

는 '다중 부분 식별자'는 무엇입니까? 때 수는 '여러 부분 식별자'되지는 바인딩 할 수 있나요? 그것은 어쨌든 어떻게 결합되고있다? 어떤 경우에이 오류가 발생합니다? 그것을 방지하는 가장 좋은 방법은 무엇입니까?

SQL 서버 2005에서 특정 오류는 다음과 같습니다

다음은 그 예이다 :

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

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

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

실제 오류 :

해결법

  1. ==============================

    1.인스턴스 MyTable.SomeRow을위한 - - 여러 부분 식별자는 여러 부분을 포함하는 필드 또는 테이블의 설명입니다 그것으로 뭔가 잘못 거기 수단 있음을 준수 할 수없는 경우 - 중 당신은 단순한 오타가있어, 또는 혼란 사이 테이블 및 열. 또한 []로 주변을 테이블 또는 필드 이름에 예약어를 사용하지 않음으로써 발생할 수 있습니다. 또한 대상 테이블에서 필요한 모든 열을 포함하지 않음으로써 발생할 수 있습니다.

    인스턴스 MyTable.SomeRow을위한 - - 여러 부분 식별자는 여러 부분을 포함하는 필드 또는 테이블의 설명입니다 그것으로 뭔가 잘못 거기 수단 있음을 준수 할 수없는 경우 - 중 당신은 단순한 오타가있어, 또는 혼란 사이 테이블 및 열. 또한 []로 주변을 테이블 또는 필드 이름에 예약어를 사용하지 않음으로써 발생할 수 있습니다. 또한 대상 테이블에서 필요한 모든 열을 포함하지 않음으로써 발생할 수 있습니다.

    레드 게이트 SQL 프롬프트와 같은 뭔가 (외래 키를 기반으로 조인 그것은 심지어 자동 완료) 수동으로 입력하는 것을 피하기위한 훌륭하지만 무료로하지 않습니다. 는 레드 게이트의 버전으로 완료된 것으로 매우 아니지만 SQL 서버 2008 지원은 상자 밖으로 IntelliSense를.

  2. ==============================

    2.사실 때때로 다른 테이블의 데이터에서 하나 개의 테이블을 업데이트 할 때, 당신이 잘못 테이블 약어를 사용할 때 또는 필요하지 않을 때이 오류 원인이라고 일반적인 문제 중 하나라고 생각한다. 올바른 문장은 다음과 같습니다 :

    사실 때때로 다른 테이블의 데이터에서 하나 개의 테이블을 업데이트 할 때, 당신이 잘못 테이블 약어를 사용할 때 또는 필요하지 않을 때이 오류 원인이라고 일반적인 문제 중 하나라고 생각한다. 올바른 문장은 다음과 같습니다 :

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

    표 1에서 SomeField 열 t1.SomeField로 T1 규정을 가지고 있지 않고 단지 SomeField되는 것을 알 수 있습니다.

    하나 개의 시도는 눈치 챘을하는 여러 부분의 오류를 반환합니다 t1.SomeField에게 문을 지정하여 업데이트합니다.

  3. ==============================

    3.아마 오타입니다. 당신은 [스키마] 전화 코드의 위치를 ​​찾습니다. [TABLENAME (당신이 필드를 참조 기본적으로 어디서나) 및 확인 모든 것이 올바르게 입력되어 있는지 확인합니다.

    아마 오타입니다. 당신은 [스키마] 전화 코드의 위치를 ​​찾습니다. [TABLENAME (당신이 필드를 참조 기본적으로 어디서나) 및 확인 모든 것이 올바르게 입력되어 있는지 확인합니다.

    개인적으로, 나는 내 모든 테이블에 대한 별명을 사용하여이를 방지하려고합니다. , 또한 당신의 쿼리가 더 쉽게 읽을 - 그것은 (> 이태리 놈 즉 WorkOrderParts) 당신이 그것의 설명의 약어로 긴 테이블 이름을 단축 할 수있을 때 엄청난 도움이됩니다.

    편집 : 당신이 유형에있는 모든 스키마, 테이블 및 필드 이름 대 세 또는 4 편지 별칭이 모두 함께있을 때 추가 보너스로, 키 입력의 톤을 절약 할 수 있습니다.

  4. ==============================

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

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

    다중 식별자가 될 수있다 : MyDatabase.dbo.MyTable. 당신이이 식별자의 잘못 중 하나를 얻는 경우에, 당신은 매핑 할 수없는 다중 식별자를 가지고있다.

    그것을 방지하는 가장 좋은 방법은 쿼리를 한 번에 제대로 쓰기, 또는 인텔리 제공 관리 스튜디오를위한 플러그인을 사용하여 오타를 피함으로써 당신을 도울 것입니다.

  5. ==============================

    5.당신은 아마 오타가 있습니다. 이 소유자 이름을 포함하여 그것을 참조하는 것이 좋습니다하지만 당신이라는 이름의 데이터베이스 판매에서 고객라는 이름의 테이블이있는 경우 예를 들어, 당신이 Sales..Customer로 참조 할 수 ((DBO는 Sales.dbo 같은) 기본 소유자 .고객.

    당신은 아마 오타가 있습니다. 이 소유자 이름을 포함하여 그것을 참조하는 것이 좋습니다하지만 당신이라는 이름의 데이터베이스 판매에서 고객라는 이름의 테이블이있는 경우 예를 들어, 당신이 Sales..Customer로 참조 할 수 ((DBO는 Sales.dbo 같은) 기본 소유자 .고객.

    당신이 판매 ... 고객을 입력 한 경우, 당신은 당신이받은 메시지를 입수했습니다 수 있습니다.

  6. ==============================

    6.당신이 오타 맞춤법 현명한 아니라고 확신한다면, 아마도 오타 케이스 - 현명하다.

    당신이 오타 맞춤법 현명한 아니라고 확신한다면, 아마도 오타 케이스 - 현명하다.

    당신은 어떻게 정렬을 사용하고 있습니까? 확인해 봐.

  7. ==============================

    7.업데이트 테이블을 만들 때 반드시 별칭을 통해 필드에게 업데이트를 참조하지 않습니다.

    업데이트 테이블을 만들 때 반드시 별칭을 통해 필드에게 업데이트를 참조하지 않습니다.

    난 그냥 다음 코드로 오류가 발생한

    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
    

    나는 다음과 같이 읽도록 설정 문에서 별칭 참조를 제거해야

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

    8.나는 같은 축약하려고 할 때이 많이 얻을 것을 발견 :

    나는 같은 축약하려고 할 때이 많이 얻을 것을 발견 :

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

    을로 변경 :

    Table1, Table2 
    where Table1.ID = Table2.ID
    

    쿼리 작업을하고 오류가 발생하지.

  9. ==============================

    9.나는이 문제를 가지고 있었다 그것은 잘못된 테이블 별칭으로 밝혀졌다. 이 문제를 해결 수정.

    나는이 문제를 가지고 있었다 그것은 잘못된 테이블 별칭으로 밝혀졌다. 이 문제를 해결 수정.

  10. ==============================

    10.내 실수로 테이블 별칭에 스키마를 넣어했다 :

    내 실수로 테이블 별칭에 스키마를 넣어했다 :

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

    11.내가 P.PayeeName AS '지불 자'를했다 -, 두 주석 행이 오류가 발생했습니다

    내가 P.PayeeName AS '지불 자'를했다 -, 두 주석 행이 오류가 발생했습니다

  12. ==============================

    12.사실은 내가 오류가 발생했습니다 이유가 다른 사람에 테이블을 조인하는 것을 잊었다

    사실은 내가 오류가 발생했습니다 이유가 다른 사람에 테이블을 조인하는 것을 잊었다

    이런 식으로 있어야 :

      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)
    
  13. ==============================

    13.에러 코드

    에러 코드

    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을 사용하고, 따라서 오류가 발생했습니다. 대신 실제 이름의 선언 된 이름을 사용합니다. 문제 해결됨.

  14. ==============================

    14.오류가있는 것은 [] 서라운드 테이블 이름에 괄호를 사용하는 것입니다 내 최고의 조언은, 테이블의 약자 때로는 오류, (언젠가 테이블 약어 단지 잘 작동 ... 이상한)를 발생

    오류가있는 것은 [] 서라운드 테이블 이름에 괄호를 사용하는 것입니다 내 최고의 조언은, 테이블의 약자 때로는 오류, (언젠가 테이블 약어 단지 잘 작동 ... 이상한)를 발생

  15. ==============================

    15.앞에서 설정 필드에 테이블 별칭을 추가하면 내 경우에는이 문제가 발생합니다.

    앞에서 설정 필드에 테이블 별칭을 추가하면 내 경우에는이 문제가 발생합니다.

    권리 업데이트 표 설정 SomeField = t2.SomeFieldValue 표 1의 T1에서 내부는 T2로 표 2에 참여     t1.ID = t2.ID에

    잘못된 업데이트 표 설정 t1.SomeField = t2.SomeFieldValue 표 1의 T1에서 내부는 T2로 표 2에 참여     t1.ID = t2.ID에

  16. ==============================

    16.나는이 오류가 발생하고 문제가 어디에 있는지 바로 볼 수 없었다. 나는 두 곳의 밖을 내다 봤더니 내 별명 및 구문 아무것도 모두 확인. 쿼리는 내가 모든 시간을 쓰기 것과 유사했다.

    나는이 오류가 발생하고 문제가 어디에 있는지 바로 볼 수 없었다. 나는 두 곳의 밖을 내다 봤더니 내 별명 및 구문 아무것도 모두 확인. 쿼리는 내가 모든 시간을 쓰기 것과 유사했다.

    나는 쿼리 (I 원래 보고서 .rdl 파일에서 복사 한) 다음, 다시 바로 다시 쓰기로 결정하고, 그것을 잘 달렸다. 이제 쿼리를 보면, 그들은 나에게 같은 모양,하지만 내 하나 개의 작품을 다시는 작성.

    다만 그것이 가치가 총에 아무것도 다른 작품의 경우가 될 수 있음을 말하고 싶었다.

  17. ==============================

    17.당신이 테이블에서 입력 할 때 이러한 오류가 사라집니다. 귀하의 입력 후 인텔리가 작동하며 여러 부분으로 구성된 식별자가 작동 무엇을 아래에서 입력합니다.

    당신이 테이블에서 입력 할 때 이러한 오류가 사라집니다. 귀하의 입력 후 인텔리가 작동하며 여러 부분으로 구성된 식별자가 작동 무엇을 아래에서 입력합니다.

  18. ==============================

    18.나는이 문제를 직면하고 그것을 해결하지만 및 내 코드 사이에 차이가있다. 에도 불구하고 나는 당신이 "다중 부분 식별자 바인딩 할 수 없습니다"무엇인지 이해할 수있을 것 같아요

    나는이 문제를 직면하고 그것을 해결하지만 및 내 코드 사이에 차이가있다. 에도 불구하고 나는 당신이 "다중 부분 식별자 바인딩 할 수 없습니다"무엇인지 이해할 수있을 것 같아요

    이 코드를 사용하는 경우

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

    나는 여러 부분으로 구성된 식별자 문제에 직면

    나는 이메일 주소에 대한 작은 따옴표를 사용하는 경우 그러나 그것은 해결

     select * from tbTest where email = 'sakira@gmail.com'
    
  19. from https://stackoverflow.com/questions/206558/what-is-a-multi-part-identifier-and-why-cant-it-be-bound by cc-by-sa and MIT license