Compartir a través de


MSSQLSERVER_4186

Detalles

Nombre del producto SQL Server
Id. del evento 4186
Origen del evento MSSQLSERVER
Componente SQLEngine
Nombre simbólico
Texto del mensaje La columna '%ls.%.*ls' no puede ser referenciada en la cláusula OUTPUT porque la definición de la columna contiene una subconsulta o referencia a una función que realiza el acceso a datos del usuario o del sistema. De forma predeterminada, se supone que una función realiza el acceso a datos si no es delimitada por esquemas. Considere la posibilidad de quitar la subconsulta o función de la definición de columna o quitar la columna de la cláusula OUTPUT.

Explicación

Para evitar el comportamiento no determinista, la cláusula OUTPUT no puede hacer referencia a una columna desde una vista o función con valores de tabla insertados cuando una de las columnas se define mediante uno de los métodos siguientes:

  • Una subconsulta.

  • Una función definida por el usuario que realiza el acceso a datos del usuario o del sistema, o se supone que realiza este acceso.

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

Ejemplos

Ver columna 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 State columna de la cláusula OUTPUT y produce un error porque por la subconsulta de la lista de selección.

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  

Ver columna definida por una función

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

Acción del usuario

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

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

    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 la definición de la función definida por el usuario. Si la función no realiza el acceso a datos del usuario o del sistema, modifique la función para incluir la cláusula WITH SCHEMABINDING.

  • Quite la columna de la cláusula OUTPUT.

Véase también

Cláusula OUTPUT (Transact-SQL)