MSSQLSERVER_4186
적용 대상: SQL Server
세부 정보
attribute | 값 |
---|---|
제품 이름 | SQL Server |
이벤트 ID | 4186 |
이벤트 원본 | MSSQLSERVER |
구성 요소 | SQLEngine |
심볼 이름 | |
메시지 텍스트 | 열 정의에 하위 쿼리가 포함되거나 사용자 또는 시스템 데이터 액세스를 수행하는 함수를 참조하므로 OUTPUT 절에서 열 '%ls.%.*ls'을(를) 참조할 수 없습니다. 함수는 스키마바운드가 아닌 경우 기본적으로 데이터 액세스를 수행하는 것으로 간주됩니다. 열 정의에서 하위 쿼리 또는 함수를 제거하거나 OUTPUT 절에서 열을 제거하는 것이 좋습니다. |
설명
비결정적 동작을 방지하기 위해 OUTPUT 절은 다음 방법 중 하나로 해당 열을 정의할 때 뷰 또는 인라인 테이블 반환 함수에서 열을 참조할 수 없습니다.
하위 쿼리
사용자 또는 시스템 데이터 액세스를 수행하거나 이러한 액세스를 수행하는 것으로 간주되는 사용자 정의 함수
해당 정의에서 사용자 또는 시스템 데이터 액세스를 수행하는 사용자 정의 함수가 포함된 계산 열
예제
하위 쿼리에 의해 정의되는 뷰 열
다음 예에서는 열 State
를 정의하기 위해 선택 목록에 있는 하위 쿼리를 사용하는 뷰를 만듭니다. 그런 다음 UPDATE 문은 OUTPUT 절의 State
열을 참조하고 선택 목록의 하위 쿼리를 ob하기 때문에 실패합니다.
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
함수에 의해 정의된 열 보기
다음 예제에서는 열 CurrentInventory
를 정의하기 위해 선택 목록에 있는 데이터 액세스 스칼라 함수 dbo.ufnGetStock
을 사용하는 뷰를 만듭니다. 그러면 UPDATE 문이 OUTPUT 절의 CurrentInventory
열을 참조합니다.
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 절에서 열을 제거합니다.