Bagikan melalui


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.

Lihat Juga

Klausul OUTPUT (Transact-SQL)