MSSQLSERVER_4104
新增: 2008 年 11 月 17 日
詳細資料
產品名稱 |
SQL Server |
產品版本 |
9.0 |
產品組建編號 |
|
事件識別碼 |
4104 |
事件來源 |
MSSQLSERVER |
元件 |
SQLEngine |
符號名稱 |
ALG_MULTI_ID_BAD |
訊息文字 |
無法繫結多重部分 (Multi-Part) 識別碼 "%.*ls"。 |
說明
SQL Server 中的實體名稱又稱為*「識別碼」*(Identifier)。例如,每當您藉由在查詢中指定資料行和資料表名稱的方式參考實體時,就會使用識別碼。多重部分 (Multi-Part) 識別碼會包含一或多個限定詞當做識別碼的前置詞。例如,資料表識別碼的前面可能會加上包含此資料表的資料庫名稱和結構描述名稱等限定詞,或者資料行識別碼的前面可能會加上資料表名稱或資料表別名等限定詞。
錯誤 4104 表示指定的多重部分 (Multi-Part) 識別碼無法對應至現有的實體。這項錯誤可能會在下列情況下傳回:
提供成資料行名稱前置詞的限定詞無法對應至查詢中所用的任何資料表或別名名稱。
例如,下列陳述式會使用資料表別名 (Dept
) 當做資料行前置詞,不過 FROM 子句沒有參考此資料表別名。SELECT Dept.Name FROM HumanResources.Department;
在下列陳述式中,多重部分 (Multi-Part) 資料行識別碼
TableB.KeyCol
指定於 WHERE 子句中,當做兩個資料表之間 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 無法判斷多重部分 (Multi-Part) 識別碼是指前面加上資料表的資料行,還是前面加上資料行的 CLR 使用者定義資料類型 (UDT) 屬性。發生這種情況的原因是,UDT 資料行屬性的參考方式是在資料行名稱和屬性名稱之間使用句號分隔符號 (.),而這種方式與在資料表名稱前面加上資料行名稱相同。下列範例會建立兩份資料表:
a
和b
。資料表b
包含資料行a
,而且它會使用 CLR UDTdbo.myudt2
當做其資料類型。SELECT 陳述式包含多重部分 (Multi-Part) 識別碼a.c2
。CREATE TABLE a (c2 int); GO CREATE TABLE b (a dbo.myudt2); GO SELECT a.c2 FROM a, b;
假設 UDT
myudt2
沒有名為c2
的屬性,SQL Server 就無法判斷識別碼a.c2
是指資料表a
中的資料行c2
,還是資料表b
中屬性為c2
的資料行a
。
使用者動作
針對查詢之 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;
針對識別碼使用唯一且清楚定義的名稱。這樣做可以讓您的程式碼更容易讀取和維護,而且也會將多個實體的參考產生模稜兩可的風險降到最低。