2017-04-11 3 views
1

테이블에 새 열을 추가 한 다음 테이블을 업데이트하고 이전 열의 날짜 형식을 변경하여 새 열을 설정하려고합니다.테이블을 변경하는 절차 및 잘못된 열이 계속 업데이트되지 않습니다.

나는 다음과 같이 내 절차는 규정이 있습니다

begin 
alter table [dbo].[mytable] 
add New_Field1 varchar(24) 
end 

...... 

update [dbo].[SMR06_TARGET] 
set New_Field1 = convert(varchar(24),Old_Field1,103) 

..... 

내가 새로운 각 열의 맨 아래에있는 테이블 및 업데이트 문의 상단에 여러 테이블 변경 문이있다. 나는 이것이 DDL을 최상위에, DML을 최하위에 두는 SQL을 가진 규칙이라고 생각한다.

Ok 그래서 프로 시저를 만들 때마다이 메서드를 실행하여 잘못된 열 이름 New_Field1로 실패합니다. 나는이 문제를 일으키는 원인이 될 수는 없습니다. 나는 BEGIN ....의 다른 변종을 시도했다. 끝은 apprent의 기분을 상하게하는 성명서를 주석 처리했다. 그리고 나서 그것은 실행되고, 다음 문장으로 다시 실패한다.

저는 계산서가 종료되는 방식과 관련이 있다고 생각합니다. 나는 혼합 DDL/DML을 사용하기 전에이 유형의 프로 시저 문을 수행하지 않았기 때문에 확실하지 않습니다.

모든 힌트를 환영합니다.

감사

앤드류

+2

배치로 분리해야합니다. alter table 명령문 (각각) 다음에 GO를 사용하십시오. – scsimon

+1

저장 프로 시저에서 실제로이 작업을 수행하려고합니까? 그렇다면 왜? 한 번 이상 실행할 수 없습니다. –

+0

다른 필드를 다른 형식으로 추가하면 안됩니다. Old_Field1을 datetime 데이터 형식으로 유지하고 원하는 모양이 다른 경우 select 문에서 변환을 사용하십시오. 좋아요 : new_Field1로 convert (varchar (24), Old_Field1,103)를 선택하십시오. – Chuck

답변

1

당신은 배치에 업데이트 문 별도로 열을 추가 진술이 필요합니다.

BEGIN TRANSACTION 
GO 
ALTER TABLE [dbo].[mytable] 
ADD New_Field1 varchar(24) NULL 
GO 

UPDATE [dbo].[mytable] 
SET New_Field1 = convert(varchar(24),Old_Field1,103) 
GO 
ALTER TABLE dbo.Batch SET (LOCK_ESCALATION = TABLE) 
GO 
COMMIT 
1

전체 배치는 첫 번째 줄 실행을 시작하기 전에 파서에 의해 검토됩니다. Old_Field1을 추가하는 것은 Old_Field1을 사용하는 참조와 동일한 배치에 있습니다. 구문 분석기가 Old_Field1을 포함하는 문을 고려할 때 Old_Field1을 추가하는 문은 실행되지 않았으므로이 필드는 아직 존재하지 않습니다.

SSMS에서 실행중인 경우 각 문 사이에 GO를 포함 시키면 여러 배치가 강제 실행됩니다. GO를 사용할 수없는 다른 도구에서이 작업을 실행하는 경우 각 구문을 개별적으로 제출하여 다음 단계를 구문 분석하기 전에 해당 구문이 완전히 실행되는지 확인해야합니다.