다음을 통해 공유


MSSQLSERVER_4186

세부 정보

제품 이름 SQL Server
이벤트 ID 4186
이벤트 원본 MSSQLSERVER
구성 요소 SQLEngine
심볼 이름
메시지 텍스트 '%ls.%.*ls' 열은 열 정의에 하위 쿼리가 포함되어 있거나 사용자 또는 시스템 데이터 액세스를 수행하는 함수를 참조하므로 OUTPUT 절에서 참조할 수 없습니다. 함수는 스키마바운드가 아닌 경우 기본적으로 데이터 액세스를 수행하는 것으로 간주됩니다. 열 정의에서 하위 쿼리 또는 함수를 제거하거나 OUTPUT 절에서 열을 제거하는 것이 좋습니다.

설명

비결정적 동작을 방지하기 위해 OUTPUT 절은 다음 방법 중 하나로 해당 열을 정의할 때 뷰 또는 인라인 테이블 반환 함수에서 열을 참조할 수 없습니다.

  • 하위 쿼리입니다.

  • 사용자 또는 시스템 데이터 액세스를 수행하거나 이러한 액세스를 수행하는 것으로 간주되는 사용자 정의 함수입니다.

  • 정의에서 사용자 또는 시스템 데이터 액세스를 수행하는 사용자 정의 함수를 포함하는 계산 열입니다.

예시

하위 쿼리로 정의된 열 보기

다음 예제에서는 선택 목록에서 하위 쿼리를 사용하여 열을 State정의하는 뷰를 만듭니다. 그런 다음 UPDATE 문은 OUTPUT 절의 State 열을 참조하지만 선택 목록에 있는 하위 쿼리 때문에 실패합니다.

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 문은 그런 다음 OUTPUT 절에서 CurrentInventory 열을 참조합니다.

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 절에서 열을 제거합니다.

또한 참조하십시오

OUTPUT 절(Transact-SQL)