MSSQLSERVER_4104
適用於:SQL Server
詳細資料
屬性 | 值 |
---|---|
產品名稱 | SQL Server |
事件識別碼 | 4104 |
事件來源 | MSSQLSERVER |
元件 | SQLEngine |
符號名稱 | ALG_MULTI_ID_BAD |
訊息文字 | 無法繫結多重部分 (Multi-Part) 識別碼 "%.*ls"。 |
說明
SQL Server 中實體的名稱稱為其 識別碼 。 每當參考實體時,只要在查詢中指定資料行和資料表名稱,就會使用識別碼。 多部分識別碼包含一或多個限定詞作為識別碼的前置詞。 例如,資料表識別碼可能前面加上限定詞,例如包含資料表的資料庫名稱和架構名稱,或者資料行識別碼的前置詞可能會加上資料表名稱或資料表別名等限定詞。
錯誤 4104 表示指定的多部分識別碼無法對應至現有的實體。 此錯誤可以在下列情況下傳回:
提供做為資料行名稱前置詞的限定詞,不會對應至查詢中使用的任何資料表或別名名稱。
例如,下列語句會使用資料表別名 (
Dept
) 作為資料行前置詞,但 FROM 子句中不會參考資料表別名。SELECT Dept.Name FROM HumanResources.Department;
在下列語句中,在 WHERE 子句中指定多部分資料行識別碼
TableB.KeyCol
,做為兩個數據表之間 JOIN 條件的一部分,TableB
但在查詢中並未明確參考。DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;
SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;
FROM 子句中會提供資料表的別名名稱,但針對資料行提供的限定詞是資料表名稱。 例如,下列語句會使用資料表名稱
Department
作為資料行前置詞;不過,資料表在 FROM 子句中參考了別名 (Dept
)。SELECT Department.Name FROM HumanResources.Department AS Dept;
使用別名時,資料表名稱無法在 語句的其他地方使用。
SQL Server 無法判斷多部分識別碼是否參照資料表前置詞的資料行,或是資料行前面加上 CLR 使用者定義資料類型 (UDT) 的屬性。 這是因為 UDT 資料行的屬性是使用資料行名稱與屬性名稱之間的句點分隔符號 (.)來參考,就像資料行名稱前面加上資料表名稱一樣。 下列範例會建立兩個數據表和
a
b
。 資料表b
包含資料行a
,它會使用 CLR UDTdbo.myudt2
做為其資料類型。 SELECT 語句包含多部分識別碼a.c2
。CREATE TABLE a (c2 int); GO
CREATE TABLE b (a dbo.myudt2); GO
SELECT a.c2 FROM a, b;
假設 UDT 沒有名為
c2
的屬性,SQL Server 無法判斷識別碼a.c2
是否參照c2
資料表a
中的資料行或資料表b
中的資料行a
、 屬性c2
。myudt2
使用者動作
比對查詢 FROM 子句中指定的資料表名稱或別名名稱的資料行前置詞。 如果為 FROM 子句中的資料表名稱定義別名,您就只能使用別名做為與該資料表相關聯之資料行的限定詞。
上述參考
HumanResources.Department
資料表的語句可以更正如下:SELECT Dept.Name FROM HumanResources.Department AS Dept; GO
SELECT Department.Name FROM HumanResources.Department; GO
確定查詢中指定了所有資料表,而且已正確指定資料表之間的 JOIN 條件。 上述 DELETE 子句可以更正,如下所示:
DELETE FROM dbo.TableA WHERE TableA.KeyCol = (SELECT TableB.KeyCol FROM TableB WHERE TableA.KeyCol = TableB.KeyCol); GO
上述
TableA
的 SELECT 語句可以更正,如下所示:SELECT 'X' FROM TableA, TableB WHERE TableB.KeyCol = TableA.KeyCol;
或
SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;
使用唯一、清楚定義的識別碼名稱。 這樣做可讓您的程式碼更容易讀取和維護,同時也可將多個實體模棱兩可參考的風險降到最低。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應