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
danb
. Tabelb
berisi koloma
, yang menggunakan UDTdbo.myudt2
CLR sebagai jenis datanya. Pernyataan SELECT berisi pengidentifikasia.c2
multi-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 bernamac2
, SQL Server tidak dapat menentukan apakah pengidentifikasia.c2
merujuk ke kolomc2
dalam tabela
atau ke koloma
, propertic2
dalam tabelb
.
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;
or
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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk