Partilhar via


MSSQLSERVER_4186

Detalhes

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 da coluna contém uma subconsulta ou faz referência a uma função que executa o acesso a dados do usuário ou do sistema. Uma função é assumida por padrão para executar o acesso a dados se ela não estiver relacionada ao esquema. Considere remover a subconsulta ou função da definição da coluna ou remover a coluna da cláusula OUTPUT.

Explicação

Para impedir o comportamento não determinístico, a cláusula OUTPUT não pode referenciar uma coluna de uma exibição ou função com valor de tabela embutida quando essa coluna é definida por um dos seguintes métodos:

  • Uma subconsulta.

  • Uma função definida pelo usuário que executa o acesso a dados do usuário ou do sistema ou é assumida para executar esse acesso.

  • Uma coluna computada que contém uma função definida pelo usuário, a qual, em sua definição, realiza o acesso a dados do usuário ou do sistema.

Exemplos

Exibir coluna definida por uma subconsulta

O exemplo a seguir cria uma exibição que usa uma subconsulta na lista de seleção para definir a coluna State. Em seguida, uma instrução UPDATE faz referência à coluna State na cláusula OUTPUT e falha devido à subconsulta na lista de seleção.

USE AdventureWorks2012;  
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  

Exibir coluna definida por uma função

O exemplo a seguir cria uma exibição que usa a função dbo.ufnGetStock escalar e de acesso a dados na lista de seleção para definir a coluna CurrentInventory. Uma instrução UPDATE faz referência à coluna CurrentInventory na cláusula OUTPUT.

USE AdventureWorks2012;  
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 maneiras:

  • Use junções em vez de subconsultas para definir a coluna na exibição ou função. Por exemplo, você pode reescrever a exibição dbo.V1 da seguinte maneira.

    USE AdventureWorks2012;  
    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 usuário. Se a função não executar o acesso a dados do usuário ou do sistema, altere a função para incluir a cláusula WITH SCHEMABINDING.

  • Remova a coluna da cláusula OUTPUT.

Consulte Também

Cláusula OUTPUT (Transact-SQL)