MSSQLSERVER_4186

Se aplica a:SQL Server

Detalles

Atributo Value
Nombre de producto SQL Server
Id. de evento 4186
Origen de eventos MSSQLSERVER
Componente SQLEngine
Nombre simbólico
Texto del mensaje No se puede hacer referencia a la columna '%ls.%.*ls' en la cláusula OUTPUT porque la definición de columna contiene una subconsulta o hace referencia a una función que obtiene acceso a datos de usuario o del sistema. De forma predeterminada, se asume que una función obtiene acceso a los datos si no está enlazada a un esquema. Considere la posibilidad de quitar la subconsulta o la función de la definición de columna o quitar la columna de la cláusula OUTPUT.

Explicación

Para evitar un comportamiento no determinista, la cláusula OUTPUT no puede hacer referencia a una columna desde una vista o una función insertada con valores de tabla si dicha tabla se ha definido mediante uno de los métodos siguientes:

  • Una subconsulta.

  • Una función definida por el usuario que obtiene acceso a datos de usuario o del sistema, o que se asume que obtiene dicho acceso.

  • Una columna calculada que contiene una función definida por el usuario que obtiene acceso a datos de usuario o del sistema en su definición.

Ejemplos

Columna de vista definida por una subconsulta

En el ejemplo siguiente se crea una vista que usa una subconsulta en la lista de selección para definir la columna State. A continuación, una instrucción UPDATE hace referencia a la columna State en la cláusula OUTPUT y produce un error a causa de la subconsulta en la lista de selección.

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  

Columna de vista definida por una función

En el ejemplo siguiente se crea una vista que usa la función escalar de acceso a datos dbo.ufnGetStockde la lista de selección para definir la columna CurrentInventory. A continuación, una instrucción UPDATE hace referencia a la columna CurrentInventory en la 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;  

Acción del usuario

El error 4186 se puede corregir de una de las siguientes maneras:

  • Use combinaciones en lugar de subconsultas para definir la columna en la vista o en la función. Por ejemplo, puede volver a escribir la vista dbo.V1 como sigue.

    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 la definición de la función definida por el usuario. Si la función no obtiene acceso a datos de usuario o del sistema, modifíquela para que incluya la cláusula WITH SCHEMABINDING.

  • Quite la columna de la cláusula OUTPUT.

Consulte también

OUTPUT (cláusula de Transact-SQL)