Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.V1enligt 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.