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 | 4186 |
| Olay Kaynağı | MSSQLSERVER |
| Bileşen | SQLEngine |
| Sembolik Ad | |
| İleti Metni | Sütun '%ls.%.*ls', sütun tanımı bir alt sorgu veya kullanıcı ya da sistem veri erişimi gerçekleştiren bir işlev referansları içerdiği için OUTPUT yan tümcesinde referans alınamaz. İşlev, şemaya bağlı değilse veri erişimi gerçekleştirmek için varsayılan olarak kabul edilir. Sütun tanımından alt sorguyu veya işlevi kaldırmayı veya output yan tümcesinden sütunu kaldırmayı göz önünde bulundurun. |
Explanation
Belirsizlik davranışını önlemek için, OUTPUT maddesi, bir görünümden veya satır içi tablo değerli fonksiyondan bir sütuna referans veremez; bu sütun aşağıdaki yöntemlerden biriyle tanımlanmıştır:
Bir alt sorgu.
Kullanıcı veya sistem veri erişimi gerçekleştiren veya bu tür bir erişim gerçekleştirdiğini varsayılan kullanıcı tanımlı bir işlev.
Tanımında kullanıcı veya sistem veri erişimi gerçekleştiren kullanıcı tanımlı bir işlev içeren hesaplanan sütun.
Examples
Alt sorgu tarafından tanımlanan sütunu görüntüle
Aşağıdaki örnek, seçim listesinde bir alt sorgu kullanarak sütununu Statetanımlamak için bir görünüm oluşturur. Bir UPDATE ifade daha sonra OUTPUT maddesindeki State sütuna referans verir ve seçim listesinde alt sorgu nedeniyle başarısız olur.
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
Bir fonksiyon tarafından tanımlanan sütunu görüntüleyin
Aşağıdaki örnek, seçim listesinde veriye erişim, skaler fonksiyonunu dbo.ufnGetStock kullanarak sütununu CurrentInventorytanımlayan bir görünüm oluşturur. Bir UPDATE ifade daha sonra OUTPUT cümlesinde sütuna referans CurrentInventory verir.
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;
Kullanıcı Eylemi
4186 numaralı hata aşağıdaki yöntemlerden biriyle düzeltilebilir:
Görünüm veya fonksiyonda sütunu tanımlamak için alt sorgular yerine birleşmeler kullanın. Örneğin, görünümü
dbo.V1aşağıdaki gibi yeniden yazabilirsiniz.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;Kullanıcı tanımlı fonksiyonun tanımını inceleyin. Fonksiyon kullanıcı veya sistem verilerine erişim sağlamıyorsa, fonksiyonu WITH SCHEMABINDING maddesini içerecek şekilde değiştirin.
OUTPUT maddesinden sütunu çıkarın.