2015-01-14 7 views
2

테스트 환경에서 SQL Server 2008 R2 Express를 사용하고 프로덕션 환경에서 전체 버전을 사용하고 있습니다. 업데이트하려는 모든 레코드를 찾는 select 문을 작성했습니다. 약 1200 명. 여러 테이블을 조인하고 선택 항목은 여러 필드를 기반으로합니다.SQL Server : 조인 된 테이블의 여러 레코드 업데이트

': 00 : 00.000 2015년 1월 14일 00'내가받은 내가 원하는 것은하는 것입니다

일치하는 모든 레코드가 같은 즉 dFinalised가 설정되어 업데이트 된 신청이 UPDATE 문에이를 켭니다 업데이트 쿼리를 실행할 때 다음 오류가 발생했습니다.

하위 쿼리가 두 개 이상의 값을 반환했습니다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 식으로 사용될 때 하위 쿼리가 수행되는 경우에는 허용되지 않습니다.

나는 어떻게 든 이걸 중첩시켜야 할 것으로 기대하지만 따르기 쉬운 예제를 찾을 수 없다. 사전 데이비드

SELECT 문에

덕분에

SELECT lMeetingRegisterID 
     ,sPlanNumber 
     ,sName 
     ,sDescription 
     ,dMeeting 
     ,sMeetingTime 
     ,bManaged 

    FROM [Strata].[dbo].[MeetingRegister] 
    inner Join MeetingType on MeetingRegister.lMeetingTypeID = meetingtype.lMeetingTypeID 
    inner Join OwnersCorporation on MeetingRegister.lOwnersCorporationID = OwnersCorporation.lOwnersCorporationID 
    inner Join tbluser on OwnersCorporation.lUserID = tblUser.lUserID 

    WHERE dFinalised = '1900-01-01 00:00:00.000' 
    AND dMeeting < '2014-07-01 00:00:00.000' 
    AND bManaged != 'N' 

가 여기에 업데이트 쿼리에서 내 시도이다 매우 간단하다.

Update dbo.MeetingRegister 
set dFinalised = '2015-01-14 00:00:00.000' 
from dbo.MeetingRegister 
    inner Join MeetingType on MeetingRegister.lMeetingTypeID = meetingtype.lMeetingTypeID 
    inner Join OwnersCorporation on MeetingRegister.lOwnersCorporationID = OwnersCorporation.lOwnersCorporationID 
    inner Join tbluser on OwnersCorporation.lUserID = tblUser.lUserID 
Where dFinalised = '1900-01-01 00:00:00.000' 
    AND dMeeting < '2014-07-01 00:00:00.000' 
    AND bManaged = 'N'     
+0

그것은 당신의 값을 두 개 이상 가입하거나 하위 쿼리 반환한다는 것을 의미 당신은 하나의 홀더에 할당하려고합니다. 단일 값을 반환하려면 하위 쿼리를 잘라야합니다. –

+1

'MeetingRegister' 테이블에 트리거가 정의되어 있습니까? – peterm

+0

peterm <예이 테이블에는 트리거가 있습니다. –

답변

1

시도 테이블 식

WITH C AS (
SELECT lMeetingRegisterID 
     ,sPlanNumber 
     ,sName 
     ,sDescription 
     ,dMeeting 
     ,sMeetingTime 
     ,bManaged 
     ,dFinalised 

    FROM [Strata].[dbo].[MeetingRegister] 
    inner Join MeetingType on MeetingRegister.lMeetingTypeID = meetingtype.lMeetingTypeID 
    inner Join OwnersCorporation on MeetingRegister.lOwnersCorporationID = OwnersCorporation.lOwnersCorporationID 
    inner Join tbluser on OwnersCorporation.lUserID = tblUser.lUserID 

    WHERE dFinalised = '1900-01-01 00:00:00.000' 
    AND dMeeting < '2014-07-01 00:00:00.000' 
    AND bManaged != 'N' 
) 
Update C 
set dFinalised = '2015-01-14 00:00:00.000' 
+0

좋은 제안처럼 보입니다. –

+0

위의 쿼리 "With C"를 시도했지만 실패했습니다. 같은 오류 메시지가 나타납니다. 나는 질의 전에 트리거를 비활성화하고 곧바로 다시 활성화했다. 원래 코드가 트리거를 사용할 수 없도록 설정했는지 확신 할 수 없습니다. 나는 어쨌든 가서 그것을 시도 할 것이다. –

+0

아마도 작동합니다. 방아쇠가 문제라고 생각합니다. 하지만 일반적으로 이러한 경우 CTE를 사용하는 것을 선호합니다. – sqluser