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


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.

См. также

Справочник