MSSQLSERVER_4186

Gäller för:SQL Server

Details

Attribute Value
Produktnamn SQL Server
Händelse-ID 4186
Händelsekälla MSSQLSERVER
Component SQLEngine
Symboliskt namn
Meddelandetext Kolumn%ls.%.*ls' kan inte refereras till i OUTPUT-satsen eftersom kolumndefinitionen innehåller en underfråga eller refererar till en funktion som utför åtkomst till användar- eller systemdata. En funktion antas som standard utföra dataåtkomst om den inte är schemabunden. Överväg att ta bort underfrågan eller funktionen från kolumndefinitionen eller ta bort kolumnen från OUTPUT-satsen.

Explanation

För att förhindra icke-deterministiskt beteende kan OUTPUT-klausulen inte referera till en kolumn från en vy eller en inline tabellvärd funktion när den kolumnen definieras med någon av följande metoder:

  • En delfråga.

  • En användardefinierad funktion som utför åtkomst till användar- eller systemdata, eller som antas utföra sådan åtkomst.

  • En beräknad kolumn som innehåller en användardefinierad funktion som utför användar- eller systemdataåtkomst i sin definition.

Examples

Vykolumn definierad av en delfråga

Följande exempel skapar en vy som använder en underfråga i select-listan för att definiera kolumnen State. En UPDATE sats refererar sedan till kolumnen State i OUTPUT-klausulen och misslyckas på grund av delfrågan i select-listan.

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  

Visa kolumn definierad av en funktion

Följande exempel skapar en vy som använder funktionen för dataåtkomst och skalär dbo.ufnGetStock i select-listan för att definiera kolumnen CurrentInventory. En sats refererar UPDATE sedan till kolumnen CurrentInventory i OUTPUT-klausulen .

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;  

Användaråtgärd

Fel 4186 kan rättas till på ett av följande sätt:

  • Använd joins istället för delfrågor för att definiera kolumnen i vyn eller funktionen. Till exempel kan du skriva om vyn dbo.V1 enligt följande.

    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;  
    
  • Undersök definitionen av den användardefinierade funktionen. Om funktionen inte utför användar- eller systemdataåtkomst, ändra funktionen för att inkludera klausulen WITH SCHEMABINDING.

  • Ta bort kolumnen från OUTPUT-klausulen.

Se även

OUTPUT-sats (Transact-SQL)