MSSQLSERVER_4186
Berlaku untuk: SQL Server
Detail
Atribut | Nilai |
---|---|
Nama Produk | SQL Server |
ID Peristiwa | 4186 |
Sumber Kejadian | MSSQLSERVER |
Komponen | SQLEngine |
Nama Simbolis | |
Teks Pesan | Kolom '%ls.%.*ls' tidak dapat direferensikan dalam klausa OUTPUT karena definisi kolom berisi subkueri atau mereferensikan fungsi yang melakukan akses data pengguna atau sistem. Fungsi diasumsikan secara default untuk melakukan akses data jika tidak terikat skema. Pertimbangkan untuk menghapus subkueri atau fungsi dari definisi kolom atau menghapus kolom dari klausa OUTPUT. |
Penjelasan
Untuk mencegah perilaku nondeterministik, klausa OUTPUT tidak dapat mereferensikan kolom dari tampilan atau fungsi bernilai tabel sebaris saat kolom tersebut ditentukan oleh salah satu metode berikut:
Subkueri.
Fungsi yang ditentukan pengguna yang melakukan akses data pengguna atau sistem, atau diasumsikan untuk melakukan akses tersebut.
Kolom komputasi yang berisi fungsi yang ditentukan pengguna yang melakukan akses data pengguna atau sistem dalam definisinya.
Contoh
Tampilkan Kolom yang Ditentukan oleh Subkueri
Contoh berikut membuat tampilan yang menggunakan subkueri dalam daftar pilih untuk menentukan kolom State
. Pernyataan UPDATE kemudian mereferensikan State
kolom dalam klausa OUTPUT dan gagal karena ob subkueri dalam daftar pilih.
USE AdventureWorks2022;
GO
CREATE VIEW dbo.V1
AS
SELECT City,
-- subquery to return the State name
(SELECT Name FROM Person.StateProvince AS sp
WHERE sp.StateProvinceID = a.StateProvinceID) AS State
FROM Person.Address AS a;
GO
--Reference the State column in the OUTPUT clause of an UPDATE statement
UPDATE dbo.V1
SET City = City + 'Test'
OUTPUT deleted.City, deleted.State, inserted.City, inserted.State
WHERE State = 'Texas';
GO
Tampilkan Kolom yang Ditentukan oleh Fungsi
Contoh berikut membuat tampilan yang menggunakan akses data, fungsi dbo.ufnGetStock
skalar dalam daftar pilih untuk menentukan kolom CurrentInventory
. Pernyataan UPDATE kemudian mereferensikan CurrentInventory
kolom dalam klausa OUTPUT .
USE AdventureWorks2022;
GO
CREATE VIEW Production.ReorderLevels
AS
SELECT ProductID, ProductModelID, ReorderPoint,
dbo.ufnGetStock(ProductID) AS CurrentInventory
FROM Production.Product;
GO
UPDATE Production.ReorderLevels
SET ReorderPoint += CurrentInventory
OUTPUT deleted.ReorderPoint, deleted.CurrentInventory,
inserted.ReorderPoint, inserted.CurrentInventory
WHERE ProductModelID BETWEEN 75 and 80;
Tindakan Pengguna
Kesalahan 4186 dapat dikoreksi dengan salah satu cara berikut:
Gunakan gabungan alih-alih subkueri untuk menentukan kolom dalam tampilan atau fungsi. Misalnya, Anda dapat menulis ulang tampilan
dbo.V1
sebagai berikut.USE AdventureWorks2022; GO CREATE VIEW dbo.V1 AS SELECT City, sp.Name AS State FROM Person.Address AS a JOIN Person.StateProvince AS sp ON sp.StateProvinceID = a.StateProvinceID;
Periksa definisi fungsi yang ditentukan pengguna. Jika fungsi tidak melakukan akses data pengguna atau sistem, ubah fungsi untuk menyertakan klausa WITH SCHEMABINDING.
Hapus kolom dari klausa OUTPUT.