MSSQLSERVER_4104

Şunlar için geçerlidir: SQL Server

Details

Attribute Value
Ürün Adı SQL Server
Olay Kimliği 4104
Olay Kaynağı MSSQLSERVER
Bileşen SQLEngine
Sembolik Ad ALG_MULTI_ID_BAD
İleti Metni "Çok parçalı tanımlayıcı '%.*ls' bağlanamadı."

Explanation

SQL Server'daki bir varlığın adı, tanımlayıcısı olarak adlandırılır. Örneğin, bir sorguda sütun ve tablo adlarını belirterek varlıklara referans verdiğinizde tanımlayıcılar kullanırsınız. Çok parçalı bir tanımlayıcı, tanımlayıcı için bir veya daha fazla niteleyiciyi ön ek olarak içerir. Örneğin, bir tablo tanımlayıcısına veritabanı adı ve tablonun bulunduğu şema adı gibi niteleyiciler öneklenebilir veya sütun tanımlayıcısına tablo adı veya tablo alias gibi niteleyiciler eklenebilir.

4104 hatası, belirtilen çok parçalı tanımlayıcının mevcut bir varlığa eşlenemediğini gösterir. Bu hata aşağıdaki koşullar altında geri verilebilir:

  • Bir sütun adı için ön ek olarak verilen niteleyici, sorguda kullanılan herhangi bir tablo veya takma adla örtüşmez.

    Örneğin, aşağıdaki ifade bir tablo takma adını (Dept) sütun öneki olarak kullanır, ancak tablo aliası FROM cümlesinde referans verilmez.

    SELECT Dept.Name FROM HumanResources.Department;  
    

    Aşağıdaki ifadelerde, iki tablo arasındaki JOIN koşulunun parçası olarak WHERE cümlesinde çok parçalı bir sütun tanımlayıcısı TableB.KeyCol belirtilmiştir, ancak TableB sorguda açıkça referans verilmez.

    DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;  
    
    SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;  
    
  • Tablo için bir takma ad FROM cümlesinde sağlanır, ancak bir sütun için verilen niteleyici tablo adıdır. Örneğin, aşağıdaki ifade sütun öneki olarak tablo adını Department kullanır; ancak tablonun FROM cümlesinde referans verilen bir takma adı (Dept) vardır.

    SELECT Department.Name FROM HumanResources.Department AS Dept;  
    

    Bir takma ad kullanıldığında, tablo adı ifadenin başka bir yerinde kullanılamaz.

  • SQL Server, çok parçalı tanımlayıcının bir tablo ile ön eklenmiş bir sütuna mı yoksa bir sütun ile ön eklenmiş CLR kullanıcı tanımlı veri tipinin (UDT) bir özelliğine mi atıfta bulunduğunu belirleyemez. Bu, UDT sütunlarının özelliklerinin, sütun adı ile özellik adı arasındaki nokta ayrıcının (.) kullanılmasıyla atıfta bulunmasıdır; tıpkı bir sütun adının tablo adıyla ön ekte olduğu gibi. Aşağıdaki örnek iki tablo a oluşturur ve b. Tablob, veri tipi olarak CLR UDT a kullanan sütununu dbo.myudt2içerir. SELECT ifadesi çok parçalı bir tanımlayıcı a.c2içerir.

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

    UDT'nin myudt2 adında c2bir özelliği olmadığını varsayarsak, SQL Server, tanımlayıcının a.c2tablodaki c2 sütunu a mu yoksa atablodaki c2sütununu, özelliği b mi ifade ettiğini belirleyemez.

Kullanıcı Eylemi

  • Sütun öneklerini, sorgudaki FROM maddesinde belirtilen tablo adları veya takma adlarla eşleştirin. FROM cümlesinde bir tablo adı için bir alias tanımlanmışsa, bu takma adı yalnızca o tabloya bağlı sütunlar için niteleyici olarak kullanılabilir.

    Tabloya HumanResources.Department atıfta bulunan yukarıdaki ifadeler aşağıdaki şekilde düzeltilebilir:

    SELECT Dept.Name FROM HumanResources.Department AS Dept;  
    GO  
    
    SELECT Department.Name FROM HumanResources.Department;  
    GO  
    
  • Tüm tabloların sorguda belirtildiğinden ve tablolar arasındaki JOIN koşullarının doğru şekilde belirtildiğinden emin olun. DELETE Yukarıdaki ifade şu şekilde düzeltilebilir:

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

    Yukarıdaki SELECT ifadesi şu TableA şekilde düzeltilebilir:

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

    veya

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;  
    
  • Tanımlayıcılar için benzersiz, net tanımlanmış isimler kullanın. Bunu yapmak kodunuzu okumayı ve bakımı kolaylaştırır ve birden fazla varlığa belirsiz referans verme riskini de en aza indirir.