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