MSSQLSERVER_4186
Область применения: SQL Server
Сведения
Атрибут | Значение |
---|---|
Название продукта | SQL Server |
ИД события | 4186 |
Источник событий | MSSQLSERVER |
Компонент | SQLEngine |
Символическое имя | |
Текст сообщения | Нельзя ссылаться на столбец «%ls.%.*ls» из предложения OUTPUT, так как определение столбца содержит вложенный запрос или ссылку на функцию, которая выполняет доступ к системным данным или данным пользователя. По умолчанию предполагается, что функция выполняет доступ к данным, если она не привязана к схеме. Рассмотрите возможность удаления вложенного запроса или функции из определения столбца либо удаления столбца из предложения OUTPUT. |
Описание
Во избежание недетерминированного поведения в предложении OUTPUT запрещено ссылаться на столбец из представления или встроенной функции, возвращающей табличное значение, если этот столбец определен одним из следующих методов.
вложенный запрос.
Определяемая пользователем функция, которая осуществляет или может осуществлять доступ к пользовательским или системным данным.
Вычисляемый столбец, содержащий определяемую пользователем функцию, которая осуществляет доступ к пользовательским или системным данным в своем определении.
Примеры
Просмотр столбца, определенного вложенным запросом
В следующем примере создается представление, которое использует вложенный запрос в списке выбора, чтобы определить столбец State
. После этого инструкция UPDATE ссылается на столбец State
в предложении OUTPUT и происходит ошибка из-за вложенного запроса в списке выбора.
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
Просмотр столбца, определенного функцией
В следующем примере создается представление, которое использует в списке выбора скалярную функцию dbo.ufnGetStock
доступа к данным, чтобы определить столбец CurrentInventory
. Затем инструкция UPDATE ссылается на столбец CurrentInventory
в предложении 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;
Действие пользователя
Ошибку 4186 можно исправить одним из следующих способов.
Используйте соединения вместо вложенных запросов, чтобы определить столбец в представлении или функции. Например, можно перезаписать представление
dbo.V1
следующим образом.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;
Изучите определение определяемой пользователем функции. Если функция не осуществляет доступ к пользовательским или системным данным, измените функцию, включив в нее предложение WITH SCHEMABINDING.
Удалите столбец из предложения OUTPUT.