Bagikan melalui


MSSQLSERVER_4104

Berlaku untuk:SQL Server

Detail

Atribut Nilai
Nama Produk SQL Server
ID Peristiwa 4104
Sumber Kejadian MSSQLSERVER
Komponen SQLEngine
Nama Simbolis ALG_MULTI_ID_BAD
Teks Pesan Pengidentifikasi multi-bagian "%.*ls" tidak dapat terikat.

Penjelasan

Nama entitas di SQL Server disebut sebagai pengidentifikasinya. Anda menggunakan pengidentifikasi setiap kali Anda mereferensikan entitas, misalnya, dengan menentukan nama kolom dan tabel dalam kueri. Pengidentifikasi multi-bagian berisi satu atau beberapa kualifikasi sebagai awalan untuk pengidentifikasi. Misalnya, pengidentifikasi tabel dapat diawali dengan kualifikasi seperti nama database dan nama skema tempat tabel dimuat, atau pengidentifikasi kolom dapat diawali dengan kualifikasi seperti nama tabel atau alias tabel.

Kesalahan 4104 menunjukkan bahwa pengidentifikasi multi-bagian yang ditentukan tidak dapat dipetakan ke entitas yang ada. Kesalahan ini dapat dikembalikan dalam kondisi berikut:

  • Kualifikasi yang disediakan sebagai awalan untuk nama kolom tidak sesuai dengan nama tabel atau alias apa pun yang digunakan dalam kueri.

    Misalnya, pernyataan berikut menggunakan alias tabel (Dept) sebagai awalan kolom, tetapi alias tabel tidak dirujuk dalam klausa FROM.

    SELECT Dept.Name FROM HumanResources.Department;  
    

    Dalam pernyataan berikut, pengidentifikasi TableB.KeyCol kolom multi-bagian ditentukan dalam klausa WHERE sebagai bagian dari kondisi JOIN antara dua tabel, namun, TableB tidak dirujuk secara eksplisit dalam kueri.

    DELETE FROM TableA WHERE TableA.KeyCol = TableB.KeyCol;  
    
    SELECT 'X' FROM TableA WHERE TableB.KeyCol = TableA.KeyCol;  
    
  • Nama alias untuk tabel disediakan dalam klausa FROM, tetapi kualifikasi yang disediakan untuk kolom adalah nama tabel. Misalnya, pernyataan berikut menggunakan nama Department tabel sebagai awalan kolom; namun, tabel memiliki alias (Dept) yang dirujuk dalam klausa FROM.

    SELECT Department.Name FROM HumanResources.Department AS Dept;  
    

    Saat alias digunakan, nama tabel tidak dapat digunakan di tempat lain dalam pernyataan.

  • SQL Server tidak dapat menentukan apakah pengidentifikasi multi-bagian mengacu pada kolom yang diawali oleh tabel atau ke properti tipe data yang ditentukan pengguna CLR (UDT) yang diawali oleh kolom. Ini terjadi karena properti kolom UDT direferensikan dengan menggunakan pemisah periode (.) antara nama kolom dan nama properti dengan cara yang sama seperti nama kolom diawali dengan nama tabel. Contoh berikut membuat dua tabel, a dan b. Tabel b berisi kolom a, yang menggunakan UDT dbo.myudt2 CLR sebagai jenis datanya. Pernyataan SELECT berisi pengidentifikasi a.c2multi-bagian .

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

    Dengan asumsi bahwa UDT myudt2 tidak memiliki properti bernama c2, SQL Server tidak dapat menentukan apakah pengidentifikasi a.c2merujuk ke kolom c2 dalam tabel a atau ke kolom a, properti c2 dalam tabel b.

Tindakan Pengguna

  • Cocokkan awalan kolom dengan nama tabel atau nama alias yang ditentukan dalam klausa FROM kueri. Jika alias didefinisikan untuk nama tabel dalam klausa FROM, Anda hanya dapat menggunakan alias sebagai kualifikasi untuk kolom yang terkait dengan tabel tersebut.

    Pernyataan di atas yang mereferensikan HumanResources.Department tabel dapat dikoreksi sebagai berikut:

    SELECT Dept.Name FROM HumanResources.Department AS Dept;  
    GO  
    
    SELECT Department.Name FROM HumanResources.Department;  
    GO  
    
  • Pastikan bahwa semua tabel ditentukan dalam kueri dan bahwa kondisi JOIN antar tabel ditentukan dengan benar. Pernyataan DELETE di atas dapat dikoreksi sebagai berikut:

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

    Pernyataan SELECT di atas untuk TableA dapat dikoreksi sebagai berikut:

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

    atau

    SELECT 'X' FROM TableA INNER JOIN TableB ON TableB.KeyCol = TableA.KeyCol;  
    
  • Gunakan nama unik yang ditentukan dengan jelas untuk pengidentifikasi. Melakukannya membuat kode Anda lebih mudah dibaca dan dirawat, dan juga meminimalkan risiko referensi ambigu ke beberapa entitas.

Lihat Juga

MSSQLSERVER_107
Pengidentifikasi Database