Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
Details
| Attribute | Valor |
|---|---|
| Nome do Produto | SQL Server |
| ID do Evento | 4186 |
| Origem do evento | MSSQLSERVER |
| Componente | SQLEngine |
| Nome simbólico | |
| Texto da mensagem | Coluna '%ls.%.*ls' não pode ser referenciado na cláusula OUTPUT porque a definição de coluna contém uma subconsulta ou faz referência a uma função que executa o acesso aos dados do usuário ou do sistema. Uma função é assumida por padrão para executar o acesso a dados se não estiver ligada ao esquema. Considere remover a subconsulta ou função da definição de coluna ou remover a coluna da cláusula OUTPUT. |
Explanation
Para evitar comportamentos não determinísticos, a cláusula OUTPUT não pode referenciar uma coluna a partir de uma função de vista ou tabela inline quando essa coluna está definida por um dos seguintes métodos:
Uma subconsulta.
Uma função definida pelo usuário que executa o acesso aos dados do usuário ou do sistema, ou presume-se que execute esse acesso.
Uma coluna computada que contém uma função definida pelo usuário que executa o acesso aos dados do usuário ou do sistema em sua definição.
Examples
Coluna de visualização definida por uma subconsulta
O exemplo seguinte cria uma vista que utiliza uma subconsulta na lista select para definir a coluna State. Uma UPDATE instrução então faz referência à State coluna na cláusula OUTPUT e falha porque obtém a subconsulta na lista de seleção.
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
Coluna de visualização definida por uma função
O exemplo seguinte cria uma vista que utiliza a função dbo.ufnGetStock escalar de acesso aos dados na lista de seleção para definir a coluna CurrentInventory. Uma UPDATE instrução então faz referência à CurrentInventory coluna na cláusula OUTPUT .
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;
Ação do Usuário
O erro 4186 pode ser corrigido de uma das seguintes formas:
Use joins em vez de subconsultas para definir a coluna na vista ou função. Por exemplo, pode reescrever a vista
dbo.V1da seguinte forma.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;Examine a definição da função definida pelo utilizador. Se a função não realizar acesso a dados do utilizador ou do sistema, altere a função para incluir a cláusula WITH SCHEMABIND.
Remova a coluna da cláusula OUTPUT.