MSSQLSERVER_4104

platí pro:SQL Server

Details

Attribute Value
Název produktu SQL Server
ID události 4104
Zdroj události MSSQLSERVER
Součást SQLEngine
Symbolický název ALG_MULTI_ID_BAD
Text zprávy Identifikátor s více částmi "%.*ls" nelze svázat.

Vysvětlení

Název entity v SQL Server je označován jako její identifikátor. Identifikátory používáte vždy, když odkazujete na entity, například zadáním názvů sloupců a tabulek v dotazu. Vícedílný identifikátor obsahuje jeden nebo více kvalifikátorů jako prefix pro daný identifikátor. Například identifikátor tabulky může být předponou kvalifikátorů, jako je název databáze a název schématu, ve kterém je tabulka obsažena, nebo může být identifikátor sloupce předponocen kvalifikátory, například název tabulky nebo alias tabulky.

Chyba 4104 naznačuje, že specifikovaný vícedílný identifikátor nemohl být mapován na existující entitu. Tuto chybu lze vrátit za následujících podmínek:

  • Kvalifikátor uvedený jako prefix pro název sloupce neodpovídá žádnému názvu tabulky ani aliasu použitému v dotazu.

    Například následující příkaz používá alias tabulky (Dept) jako předponu sloupce, ale alias tabulky není v klauzuli FROM odkazován.

    SELECT Dept.Name FROM HumanResources.Department;  
    

    V následujících příkazech je vícedílný identifikátor TableB.KeyCol sloupců specifikován v klauzuli WHERE jako součást podmínky JOIN mezi dvěma tabulkami, avšak TableB v dotazu není explicitně odkazován.

    DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;  
    
    SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;  
    
  • Pseudonymní název tabulky je uveden v klauzuli FROM, ale kvalifikátor pro sloupec je název tabulky. Například následující příkaz používá název Department tabulky jako předponu sloupce; tabulka však má alias (Dept) odkazovaný v klauzuli FROM.

    SELECT Department.Name FROM HumanResources.Department AS Dept;  
    

    Když je použit alias, název tabulky nelze použít jinde ve výroku.

  • SQL Server nedokáže určit, zda vícedílný identifikátor odkazuje na sloupec s předponou tabulky, nebo na vlastnost uživatelsky definovaného datového typu CLR (UDT) předponou sloupce. K tomu dochází proto, že vlastnosti sloupců UDT jsou odkazovány pomocí oddělovače periody (.) mezi názvem sloupce a názvem vlastnosti stejným způsobem, jako je název sloupce předponocen názvem tabulky. Následující příklad vytváří dvě tabulky, a a b. Tabulka b obsahuje sloupec a, který používá CLR UDT dbo.myudt2 jako svůj datový typ. Příkaz SELECT obsahuje vícedílný identifikátor a.c2.

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

    Za předpokladu, že UDT myudt2 nemá vlastnost s názvem c2, SQL Server nemůže určit, zda identifikátor a.c2odkazuje na sloupec c2 v tabulce a nebo na vlastnost a sloupce c2, v tabulce b.

Uživatelská akce

  • Porovnejte předpony sloupců s názvy tabulek nebo aliasů specifikovanými v klauzuli FROM dotazu. Pokud je alias definován pro název tabulky v klauzuli FROM, můžete alias použít pouze jako kvalifikátor pro sloupce spojené s touto tabulkou.

    Výše uvedené tvrzení, která odkazují na tabulku HumanResources.Department , lze opravit následovně:

    SELECT Dept.Name FROM HumanResources.Department AS Dept;  
    GO  
    
    SELECT Department.Name FROM HumanResources.Department;  
    GO  
    
  • Ujistěte se, že všechny tabulky jsou v dotazu specifikovány a že podmínky JOIN mezi tabulkami jsou správně zadány. Výše uvedené DELETE tvrzení lze opravit následovně:

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

    Výše uvedený příkaz SELECT pro lze TableA opravit následovně:

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

    nebo

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;  
    
  • Používejte jedinečné, jasně definované názvy identifikátorů. Tímto způsobem se kód lépe čte a udržuje a zároveň se minimalizuje riziko nejasných odkazů na více entit.