共用方式為


MSSQLSERVER_4104

詳細資訊

產品名稱 SQL Server
事件識別碼 4104
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 算法多重ID錯誤
消息正文 無法繫結多部分標識符「%.*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 資料行的屬性是使用資料行名稱與屬性名稱之間的句點分隔符 (.)來參考,就像數據行名稱前面加上數據表名稱一樣。 下列範例會建立兩個資料表,ab。 數據表 b 包含數據行 a,它會使用CLR UDT dbo.myudt2 做為其資料類型。 SELECT 語句包含多部分識別碼 a.c2

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

    假設 myudt2 沒有名為 c2 的屬性,SQL Server 無法判斷識別碼 a.c2 是否參照表格 a 中的欄位 c2,或是表格 b 中的欄位 a,屬性 c2

使用者動作

  • 比對查詢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;  
    
  • 使用唯一、清楚定義的標識碼名稱。 這樣做可讓您的程式代碼更容易讀取和維護,同時也可將多個實體模棱兩可參考的風險降到最低。

另請參閱

MSSQLSERVER_107
資料庫識別碼