Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.V1als 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.