세부 정보
| 제품 이름 | 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 절에서 열을 제거합니다.