4

SQL Server 2000에서 SQL Server 2008 R2 SP2로 데이터베이스를 전송하고 하나의 저장 프로 시저를 제외하고 정상적으로 작동합니다.저장 프로 시저가 SQL Server 2000에서는 작동하지만 SQL Server 2008R2에서는 작동하지 않습니다.

declare @Dates table (
    ForDate smalldatetime, 
    DayStart int, 
    PRIMARY KEY CLUSTERED (ForDate) 
) 

INSERT INTO @Dates 
    SELECT M.ForDate 
    FROM @Master M 
    GROUP BY M.ForDate 

오류는 다음과 같습니다 : 오류 코드의 다음 부분에 나타납니다

메시지 213, 수준 16, 상태 1, 프로 시저 REP_Media, 라인 (115)
열 이름 제공된 값의 개수 나 테이블 정의와 일치하지 않습니다.

제가 @Dates 테이블은 변수 열 DayStart에 제공된 값이 없기 때문에 에러가 발생하는 것을 알았다. 내부 선택에 NULL을 추가 할 수 있으며 모든 것이 잘 작동합니다.

그러나 동일한 절차가 SQL Server 2000에서 작동하며 SQL Server 2008 R2 SP2에서는 작동하지 않습니다. 이유가 무엇입니까? 절차를 변경하지 않고 정상 작동을 위해 수행해야하는 작업 (일부 서버 옵션 또는 다른 솔루션)

프로 시저 정의 및 데이터베이스 옵션에서 SET ANSI_NULL_DFLT_ON ON을 사용하려고 시도했지만 성공하지 못했습니다.

+2

글쎄, 그건 정말 나쁜 연습이 같은 삽입 문을 작성하는 것입니다. insert 문을 작성할 때는 항상 열 목록을 지정해야합니다. –

+0

아쉽게도 이것은 내 코드가 아니며 이러한 요청은 데이터베이스를 사용하는 응용 프로그램의 다른 곳에서 발생할 수 있습니다. – Sergey

답변

3

SQL을 업데이트하는 것 외에 다른 작업은 할 수 없습니다.

최근 버전의 SQL Server에서는 insert...select을 열 목록에있는 것보다 SELECT 목록에있는 항목 수가 더 적게 허용하지 않습니다. 명시 적 컬럼 목록이 없으므로 identity, timestamp, calculated 이외의 모든 컬럼으로 암시됩니다.

e.e. (ForDate, DayStart)

하더라도 DayStart

INSERT INTO @Dates (ForDate) 
SELECT M.ForDate 
FROM @Master M 
GROUP BY M.ForDate 

이것은 change in behaviour 것으로 보인다 여전히 위해 명시 적 열 목록을 사용하는 구문을 변경해야하는 당신의 단일 열 SELECT 소스에서 적용 얻을 널 (NULL) SQL Server 2000 (역시 found her e)에서 볼 수 있지만 2000 년의 동작은 documented이고 SQL Server 2000 호환 모드를 사용하면 도움이되지 않습니다.

+1

나는 행동의 변화에 ​​대해 결코 알지 못했다. 많은 사람들을 사로 잡았 음에 틀림 없다. –