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