2013-04-26 6 views
0

기존 테이블에 추가 컬럼을 추가 한 후 나중에 기존 레코드에 대해 적절한 컬럼 값을 삽입해야합니다. 단일 저장 프로 시저 내에서이 작업을 수행해야합니다.작성 직후의 컬럼 값 변경 (단일 저장 프로 시저 내에서)

지금까지 다음 (SQL 관리 스튜디오는 기존 레코드에 값을 추가하기 위해 새 열 찾을 수 없다고보고)이 : 나는 "GO"키워드를 추가하는 시도

BEGIN 
    ALTER TABLE tbl1 
    ADD col_add int 

    UPDATE tbl1 
    SET [col_add]='value' 
    WHERE col_pk = 1 
    END 

을 ALTER 문과 UPDATE 문 사이에 있지만 구문 오류가보고됩니다.

미리 감사드립니다.

답변

2

나는 당신이 할 다음 '테이블을 변경'하고 업데이 트를 커밋해야합니다 생각하고, 너무 귀하의 업데이 트를 커밋하는 것을 잊지 마세요 :

BEGIN 
    BEGIN TRAN 
    ALTER TABLE tbl1 
    ADD col_add date 
COMMIT; 
    BEGIN TRAN 
    UPDATE tbl1 
    SET [col_add]='value' 
    WHERE col_pk = 1 
COMMIT; 
    END 
+0

이 절반 방법이 있습니다,하지만 당신은 당신이 커밋하기 전에 TRAN'을 BEGIN '으로 거래를 시작할 필요 그 (것)들 – GarethD

+0

당신이 순차적으로 투입하는 경우에 저것은 진짜로 필요합니까? 어쩌면 '변경', '업데이트'를 한 다음 커밋 할 경우 트랜잭션을 추가해야하지만 '변경' '커밋' '업데이트' '커밋'을하면 트랜잭션이 필요하다고 생각하지 않습니다. 어쩌면 틀린지만 ... –

+0

예, 테스트가 필요합니다. 이 절차는'BEGIN TRAN'없이 컴파일되지만 실행시 오류가 발생합니다. SQL Fiddle에 대한 권한으로 인해 실행되지 않는 테스트 스크립트 [여기] (http://sqlfiddle.com/#!3/0ed4a/1)가 있지만 DB에서 사용해 볼 수 있습니다. 'BEGIN TRAN' 행의 주석 처리를 제거하면 프로 시저가 오류없이 실행됩니다 (한 번 실행되는 경우). – GarethD

2

테이블 이름 오류 구문 분석하는 동안 발생합니다. SSMS에서 go은 일괄 처리를 분리하기 때문에 작동합니다. 그러나 저장 프로 시저는 항상 단일 배치입니다.

당신은 저장 프로 시저 내부 분석의 새로운 라운드를 강제로 exec 또는 sp_executesql를 사용할 수 있습니다

exec ('UPDATE tbl1 SET [col_add]='value' WHERE col_pk = 1') 
관련 문제