2014-04-10 8 views
3

나는 사용자가 업데이트 한보기에서 작업하고 있습니다. 이 업데이트는 기본적으로 열의 값을 변경합니다.보기 업데이트가 작동하지 않습니다.

Update or insert of view or function '' failed because it contains a derived or constant field. 

내가 선택 문에서 일정이 있기 때문입니다하지만 주위에 얻을 수있는 방법이 알고하지만 지금은 내가 그렇게이 발생하자 나던? 이 뷰에 대한 내 코드입니다

도와주세요

Create view Schema.View1 
as 
SELECT 
Convert(Varchar(20),l.jtpName) as JobType, Convert(Varchar(10),' <All> ')as SubCategory , Convert(varchar (3), Case when a.jtpName= l.jtpName and a.subName= ' <All> ' then 'Yes' else 'No' end) As AutoProcess from Schema.JobType l left join Schema.Table1 a on l.jtpName=a.jtpName 
UNION 
SELECT 
Convert(Varchar(20),a.jtpName) as JobType, Convert(Varchar(10),a.subName) as SubCategory, Convert(varchar (3),Case when b.jtpName= a.jtpName and b.subName= a.subName then 'Yes' else 'No' end) As AutoProcess from Schema.SubCategory a left join fds.Table1 b on a.subName=b.subName 

GO 

마지막으로 업데이트 문 :

UPDATE Schema.View1 SET AUTOPROCESS = Case WHEN AUTOPROCESS = 'Yes' Then 'No' END Where JOBTYPE = 'Transport' and SUBCATEGORY= 'Cargo' 

당신을 감사

답변

4

당신은의 결과 열을 업데이트 할 수 없습니다 계산. MSDN, 갱신 가능 뷰 컬럼의 조건 중 어느 한 항에

이있다 :

  • 상관 UPDATE, INSERT 포함 수정 및 삭제 명령문 하나만베이스 테이블로부터 열을 참조한다.
  • 보기에서 수정되는 열은의 테이블 열에서 직접 참조해야합니다 (). 열은 다음과 같은 다른 방법으로 파생 될 수 없습니다.
    • 집계 함수 : AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR 및 VARP.
    • 계산입니다. 다른 C 럼을 g 용하는 표현식에서 C 럼을 계산할 수 없습니다. 집합 연산자 UNION, UNION ALL, CROSSJOIN, EXCEPT 및 INTERSECT를 사용하여 형성된 열은 계산에 해당하며 업데이트 할 수도 없습니다.
  • 수정되는 열은 GROUP BY, HAVING 또는 DISTINCT 절의 영향을받지 않습니다.
  • TOP는 WITH CHECK OPTION 절과 함께 뷰의 select_statement에서 아무 곳이나 사용되지 않습니다. 여기

뿐만 아니라,보기가 UNION 문을 사용하지 업데이트하려고하는 AutoProcess 필드가 실제로 두 개의 필드를 사용하는 CASE 문의 결과입니다. 그것을 시도하고 업데이트하는 것은 이치에 맞지 않습니다.

저장 프로 시저를 사용하여 쓰기 작업을 수행하는 것이 좋습니다. 또는 Damien이 제안한 것처럼보기에서 INSTEAD OF 트리거를 사용할 수도 있습니다.

+0

감사합니다. 문서가 매우 유용합니다. 나는 다른 테이블을 만들고이 뷰의 값을 피드에 넣은 다음 뷰가 아닌 테이블을 업데이트해야 할 것입니다. – crunchynutter

+1

@crunchynutter 업데이트 작업을 처리 할 수 ​​있도록 테이블을 만들어야한다고 생각하지 않습니다. 대신 저장 프로 시저를 사용하십시오. – Crono

0

SQL Server가 변환 함수에서 원래 필드로 거꾸로 작업 할 방법이 없습니다. 이 방법으로보기를 업데이트 할 수 없습니다.

보기에 jptName 및 subName 필드가 포함되어 있으면 해당 필드 만 업데이트 할 수 있습니다.

+0

그는 여전히 'UNION' 문으로 인해이 필드를 업데이트 할 수 없습니다. – Crono

2

TRIGGER을 작성하고 inserteddeleted 의사 테이블의 변경 사항을 직접 기본 테이블에 적용해야합니다.

+0

허? – Crono

+1

@Crono - OP가 뷰에 대해 'UPDATE'를 쓸 수 있기를 원한다면 SQL Server가 뷰를 업데이트 할 수 없다고 결정했습니다. 가능한 유일한 방법은 구현하는 뷰에 트리거를 작성하는 것입니다 필요한 조치를 수동으로 수행하십시오. –

+0

* 뷰 *에 트리거를 어떻게 작성합니까? – Crono