Udostępnij przez


MSSQLSERVER_4104

Szczegóły

Nazwa produktu

SQL Server

Wersja produktu

10.50

Numer kompilacji produktu

 

Identyfikator zdarzenia

4104

Źródło zdarzenia

MSSQLSERVER

Składnik

SQLEngine

Nazwa symboliczna

ALG_MULTI_ID_BAD

Tekst komunikatu

Identyfikator wieloczęściowego "%. * ls" nie można powiązać.

Wyjaśnienie

Nazwa obiekt w SQL Server jest określany jako jego identyfikatora. Użyj identyfikatorów w każdym przypadku, gdy odwołanie podmiotów, na przykład przez określenie kolumna i tabela nazw w kwerendzie. Identyfikator wieloczęściowego zawiera jeden lub więcej kwalifikatory jako prefiks dla identyfikatora.Na przykład identyfikator tabeli może być prefiksem kwalifikatory, takie jak nazwa bazy danych i nazwa schematu, w którym znajduje się tabela lub identyfikator kolumna może być prefiksem z kwalifikatory, takie jak nazwa tabeli lub alias tabeli.

Błąd 4104 wskazuje, że określony identyfikator wieloczęściowego nie można zmapować do istniejącego obiekt.Ten błąd może zostać zwrócona w następujących warunkach:

  • Kwalifikator dostarczone jako prefiksu dla kolumna nazwa nie odpowiada dowolnej tabela lub alias nazwy używanej w kwerendzie.

    Na przykład, poniższa instrukcja korzysta alias tabela (Dept) jako prefiks kolumna, ale tabela alias nie jest wywoływany w klauzula FROM.

    SELECT Dept.Name FROM HumanResources.Department;
    

    W następujących instrukcji identyfikator wieloczęściowego kolumna TableB.KeyCol jest określony w klauzula WHERE, jako część sprzężenia warunek między dwiema tabelami, jednak TableB nie odwołuje się wyraźnie do kwerendy.

    DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;
    
    SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;
    
  • Podano nazwę alias dla tabela w klauzula FROM, ale kwalifikator dostarczone dla kolumna jest nazwa tabela.Na przykład, następująca instrukcja używa nazwy tabela Department jako prefiks kolumna; Jednakże tabela ma alias (Dept) w klauzula FROM.

    SELECT Department.Name FROM HumanResources.Department AS Dept;
    

    Użyto alias nazwy tabela nie używane w innych miejscach w instrukcja.

  • SQL Server jest w stanie ustalić, czy identyfikator wieloczęściowego odnosi się do kolumna prefiksem tabela lub właściwość CLR typu danych zdefiniowanych przez użytkownika (UDT) prefiksem według kolumna.Dzieje się tak, ponieważ właściwość kolumn UDT odwołuje się przy użyciu separatora okresu (.) między nazwę kolumna i nazwy właściwość w taki sam sposób, że nazwa kolumna jest poprzedzona nazwą tabela. Poniższy przykład tworzy dwie tabele, a i b.Tabela b zawiera kolumna a, która używa CLR UDT dbo.myudt2 jako typu danych.Instrukcja SELECT zawiera identyfikator wieloczęściowego a.c2.

    CREATE TABLE a (c2 int); 
    GO
    
    CREATE TABLE b (a dbo.myudt2); 
    GO
    
    SELECT a.c2 FROM a, b; 
    

    Zakładając, że UDT myudt2 nie ma właściwość o nazwie c2, SQL Server nie może ustalić, czy identyfikator a.c2 odwołuje się do kolumna c2 w tabela a lub do kolumna a, właściwość c2 w tabela b.

Akcja użytkownika

  • Odpowiadać prefiksy kolumna przeciwko nazwy tabela lub alias nazwy określone w klauzula FROM kwerendy.Jeśli zdefiniowano alias nazwy tabela w klauzula FROM, można używać tylko alias jako kwalifikator kolumn skojarzone z tej tabela.

    Instrukcje powyżej tego odwołania HumanResources.Department tabela mogą być skorygowane w następujący sposób:

    SELECT Dept.Name FROM HumanResources.Department AS Dept;
    GO
    
    SELECT Department.Name FROM HumanResources.Department;
    GO
    
  • Upewnij się, że podano wszystkie tabele, kwerendy i poprawnie określone warunki sprzężenia między tabelami.Instrukcja DELETE powyżej mogą być skorygowane w następujący sposób:

    DELETE FROM dbo.TableA
    WHERE TableA.KeyCol = (SELECT TableB.KeyCol 
                            FROM TableB 
                            WHERE TableA.KeyCol = TableB.KeyCol);
    GO
    

    Instrukcja SELECT powyżej dla TableA mogą być skorygowane w następujący sposób:

    SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;
    

    lub

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;
    
  • Użyj unikatowej, jasno określonych nazw identyfikatorów.Dzięki temu kodu łatwiej odczytywać i utrzymania, a także minimalizuje ryzyko niejednoznacznych odwołań do wielu podmiotów.