MSSQLSERVER_4186

Van toepassing op:SQL Server

Details

Attribute Value
Productnaam SQL Server
Gebeurtenis-id 4186
Bron van gebeurtenis MSSQLSERVER
Onderdeel SQLEngine
Symbolische naam
Berichttekst Kolom '%ls.%.*ls' kan niet worden verwezen in de OUTPUT-component omdat de kolomdefinitie een subquery bevat of verwijst naar een functie die toegang tot gebruikers- of systeemgegevens uitvoert. Er wordt standaard uitgegaan van een functie om gegevenstoegang uit te voeren als deze niet afhankelijk is van het schema. Overweeg om de subquery of functie te verwijderen uit de kolomdefinitie of om de kolom uit de OUTPUT-component te verwijderen.

Explanation

Om niet-deterministisch gedrag te voorkomen, kan de OUTPUT-clausule geen kolom verwijzen vanuit een weergave of inline tabel-waarde functie wanneer die kolom is gedefinieerd door een van de volgende methoden:

  • Een subquery.

  • Een door de gebruiker gedefinieerde functie die toegang tot gebruikers- of systeemgegevens uitvoert, of wordt ervan uitgegaan dat deze toegang wordt uitgevoerd.

  • Een berekende kolom die een door de gebruiker gedefinieerde functie bevat die toegang tot gebruikers- of systeemgegevens uitvoert in de definitie.

Examples

View-kolom gedefinieerd door een subquery

Het volgende voorbeeld maakt een weergave aan die een subquery in de select-lijst gebruikt om de kolom Statete definiëren. Een UPDATE instructie verwijst vervolgens naar de State kolom in de OUTPUT-clausule en faalt vanwege de subquery in de select-lijst.

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  

Weergavekolom gedefinieerd door een functie

Het volgende voorbeeld creëert een weergave die de data-accessing, scalaire functie dbo.ufnGetStock in de select-lijst gebruikt om de kolom CurrentInventoryte definiëren. Een instructie verwijst UPDATE vervolgens naar de CurrentInventory kolom in de OUTPUT-clausule .

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;  

Gebruikersactie

Fout 4186 kan op een van de volgende manieren worden gecorrigeerd:

  • Gebruik joins in plaats van subqueries om de kolom in de weergave of functie te definiëren. Je kunt bijvoorbeeld het beeld dbo.V1 als volgt herschrijven.

    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;  
    
  • Bekijk de definitie van de door de gebruiker gedefinieerde functie. Als de functie geen gebruikers- of systeemgegevenstoegang uitvoert, verander dan de functie om de WITH SCHEMABINDING-clausule toe te voegen.

  • Verwijder de kolom uit de OUTPUT-clausule.

Zie ook

OUTPUT-component (Transact-SQL)