MSSQLSERVER_4186

Şunlar için geçerlidir: SQL Server

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.V1 aş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.