Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.