Поделиться через


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.

См. также

Предложение OUTPUT (Transact-SQL)