Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.KeyColsloupců specifikován v klauzuli WHERE jako součást podmínky JOIN mezi dvěma tabulkami, avšakTableBv 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
Departmenttabulky 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,
aab. Tabulkabobsahuje sloupeca, který používá CLR UDTdbo.myudt2jako svůj datový typ. Příkaz SELECT obsahuje vícedílný identifikátora.c2.CREATE TABLE a (c2 int); GOCREATE TABLE b (a dbo.myudt2); GOSELECT a.c2 FROM a, b;Za předpokladu, že UDT
myudt2nemá vlastnost s názvemc2, SQL Server nemůže určit, zda identifikátora.c2odkazuje na sloupecc2v tabulceanebo na vlastnostasloupcec2, v tabulceb.
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; GOSELECT Department.Name FROM HumanResources.Department; GOUjistě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); GOVýše uvedený příkaz SELECT pro lze
TableAopravit 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.