Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.KeyColbelirtilmiştir, ancakTableBsorguda 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ı
Departmentkullanı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
aoluşturur veb. Tablob, veri tipi olarak CLR UDTakullanan sütununudbo.myudt2içerir. SELECT ifadesi çok parçalı bir tanımlayıcıa.c2içerir.CREATE TABLE a (c2 int); GOCREATE TABLE b (a dbo.myudt2); GOSELECT a.c2 FROM a, b;UDT'nin
myudt2adındac2bir özelliği olmadığını varsayarsak, SQL Server, tanımlayıcınına.c2tablodakic2sütunuamu yoksaatablodakic2sütununu, özelliğibmi 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.Departmentatıfta bulunan yukarıdaki ifadeler aşağıdaki şekilde düzeltilebilir:SELECT Dept.Name FROM HumanResources.Department AS Dept; GOSELECT Department.Name FROM HumanResources.Department; GOTü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); GOYukarı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.