MSSQLSERVER_4186MSSQLSERVER_4186

세부 정보Details

제품 이름Product Name SQL ServerSQL Server
이벤트 IDEvent ID 41864186
이벤트 원본Event Source MSSQLSERVERMSSQLSERVER
구성 요소Component SQLEngineSQLEngine
심볼 이름Symbolic Name
메시지 텍스트Message Text 열 '%ls.%.ls'의 정의가 하위 쿼리를 포함하거나 사용자 또는 시스템 데이터에 액세스하는 함수를 참조하므로 OUTPUT 절에서 해당 열을 참조할 수 없습니다.Column '%ls.%.ls' cannot be referenced in the OUTPUT clause because the column definition contains a subquery or references a function that performs user or system data access. 함수가 스키마 바인딩되지 않으면 기본적으로 데이터 액세스를 수행하도록 간주됩니다.A function is assumed by default to perform data access if it is not schemabound. 열 정의에서 하위 쿼리나 함수를 제거하거나 OUTPUT 절에서 열을 제거하십시오.Consider removing the subquery or function from the column definition or removing the column from the OUTPUT clause.

설명Explanation

비결정적 동작을 방지하기 위해 OUTPUT 절은 뷰 또는 인라인 테이블 반환 함수의 열이 다음 중 한 가지 방법으로 정의된 경우 이러한 열을 참조할 수 없습니다.To prevent nondeterministic behavior, the OUTPUT clause cannot reference a column from a view or inline table-valued function when that column is defined by one of the following methods:

  • 하위 쿼리A subquery.

  • 사용자 또는 시스템 데이터 액세스를 수행하거나 이러한 액세스를 수행하는 것으로 간주되는 사용자 정의 함수A user-defined function that performs user or system data access, or is assumed to perform such access.

  • 해당 정의에서 사용자 또는 시스템 데이터 액세스를 수행하는 사용자 정의 함수가 포함된 계산 열A computed column that contains a user-defined function that performs user or system data access in its definition.

Examples

하위 쿼리에 의해 정의되는 뷰 열View Column Defined by a Subquery

다음 예에서는 열 State를 정의하기 위해 선택 목록에 있는 하위 쿼리를 사용하는 뷰를 만듭니다.The following example creates a view that uses a subquery in the select list to define the column State. 그러면 UPDATE 문이 OUTPUT 절의 State 열을 참조하지만 선택 목록의 하위 쿼리로 인해 실패합니다.An UPDATE statement then references the State column in the OUTPUT clause and fails because ob the subquery in the select list.

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  

함수에 의해 정의되는 뷰 열View Column Defined by a Function

다음 예제에서는 열 CurrentInventory를 정의하기 위해 선택 목록에 있는 데이터 액세스 스칼라 함수 dbo.ufnGetStock을 사용하는 뷰를 만듭니다.The following example creates a view that uses the data accessing, scalar function dbo.ufnGetStock in the select list to define the column CurrentInventory. 그러면 UPDATE 문이 OUTPUT 절의 CurrentInventory 열을 참조합니다.An UPDATE statement then references the CurrentInventory column in the OUTPUT clause .

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;  

사용자 동작User Action

다음과 같은 방법으로 오류 4186을 해결할 수 있습니다.Error 4186 can be corrected in one of the following ways:

  • 하위 쿼리 대신 조인을 사용하여 뷰 또는 함수의 열을 정의합니다.Use joins instead of subqueries to define the column in the view or function. 예를 들어 다음과 같이 뷰 dbo.V1을 다시 작성할 수 있습니다.For example, you can rewrite the view dbo.V1 as follows.

    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;  
    
  • 사용자 정의 함수의 정의를 검사합니다.Examine the definition of the user-defined function. 사용자 정의 함수가 사용자 또는 시스템 액세스를 수행하지 않으면 WITH SCHEMABINDING 절을 포함하도록 함수를 변경합니다.If the function does not perform user or system data access, alter the function to include the WITH SCHEMABINDING clause.

  • OUTPUT 절에서 열을 제거합니다.Remove the column from the OUTPUT clause.

관련 항목:See Also

OUTPUT 절(Transact-SQL)OUTPUT Clause (Transact-SQL)