복붙노트

[SQL] 열이 생성 한 후 SQL 서버 업데이트에 대한 잘못된 열 이름

SQL

열이 생성 한 후 SQL 서버 업데이트에 대한 잘못된 열 이름

사람이 SQL Server에 대한이 코드를 잘못 무엇을 볼 수 있습니까?

IF NOT EXISTS(SELECT *
              FROM   sys.columns
              WHERE  Name = 'OPT_LOCK'
                     AND object_ID = Object_id('REP_DSGN_SEC_GRP_LNK'))
  BEGIN
      ALTER TABLE REP_DSGN_SEC_GRP_LNK
        ADD OPT_LOCK NUMERIC(10, 0)

      UPDATE REP_DSGN_SEC_GRP_LNK
      SET    OPT_LOCK = 0

      ALTER TABLE REP_DSGN_SEC_GRP_LNK
        ALTER COLUMN OPT_LOCK NUMERIC(10, 0) NOT NULL
  END; 

나는 이것을 실행하면, 내가 얻을 :

업데이트 명령에.

감사.

해결법

  1. ==============================

    1.이 경우 당신은 NOT NULL로 컬럼을 추가하고 여기에 내 대답에 따라 한 성명에서 기존 행에 대한 값을 설정하여 문제를 방지 할 수 있습니다.

    이 경우 당신은 NOT NULL로 컬럼을 추가하고 여기에 내 대답에 따라 한 성명에서 기존 행에 대한 값을 설정하여 문제를 방지 할 수 있습니다.

    더 일반적으로이 문제는 구문 분석 / 컴파일 문제입니다. SQL Server는 문 중 하나를 실행하기 전에 일괄 처리의 모든 문을 컴파일하려고합니다.

    때 문 참조를 모든 문에 존재하지 않는 테이블이 연기 컴파일이 적용됩니다. 테이블이 이미 존재하는 경우가 아닌 기존의 열을 참조하는 경우 오류가 발생합니다. 이번 라운드 가장 좋은 방법은 DML에서 다른 배치에 DDL을하는 것입니다.

    성명 경우 모두 참조 기존 테이블이 아닌 기존의 열 및 오류 또는 컴파일하기 전에 던져되지 않을 수있는 존재하지 않는 테이블이 지연됩니다.

    당신이 중 하나 (클라이언트 도구에 배치 분리 GO를 사용하여, 예를 들어)를 별도의 일괄 제출 또는 EXEC 또는 EXEC sp_executesql을 사용하여 개별적으로 컴파일 자식 범위에서 수행 할 수 있습니다.

    첫 번째 방법은 배치를 확장 할 수 없습니다 ...는 IF로 코드를 리팩토링 할 필요합니다.

    IF NOT EXISTS(SELECT *
                  FROM   sys.columns
                  WHERE  Name = 'OPT_LOCK'
                         AND object_ID = Object_id('REP_DSGN_SEC_GRP_LNK'))
      BEGIN
          ALTER TABLE REP_DSGN_SEC_GRP_LNK
            ADD OPT_LOCK NUMERIC(10, 0)
    
          EXEC('UPDATE REP_DSGN_SEC_GRP_LNK SET OPT_LOCK = 0');
    
          ALTER TABLE REP_DSGN_SEC_GRP_LNK
            ALTER COLUMN OPT_LOCK NUMERIC(10, 0) NOT NULL
      END; 
    
  2. ==============================

    2.오류의 근본 원인은 SQL Server Management Studio를 다시 시작할 때까지 새로 추가 된 열 이름이 sys.syscolumns 및 sys.columns 테이블에 반영되지 않습니다이다.

    오류의 근본 원인은 SQL Server Management Studio를 다시 시작할 때까지 새로 추가 된 열 이름이 sys.syscolumns 및 sys.columns 테이블에 반영되지 않습니다이다.

  3. ==============================

    3.NOT은 COL_LENGTH 기능이있는 경우 귀하의 정보의 경우, 교체 할 수 있습니다. 그것은 두 개의 매개 변수

    NOT은 COL_LENGTH 기능이있는 경우 귀하의 정보의 경우, 교체 할 수 있습니다. 그것은 두 개의 매개 변수

    그것은 NULL을 반환 한 후 찾을 수없는 경우 지능 (4 바이트) : 열이 발견되면 다음 열 예의 데이터 타입의 범위를 반환합니다.

    다음과 같이 그래서, 당신이 사용할 수 있으며 하나에 3 제표를 결합합니다.

    IF (SELECT COL_LENGTH('REP_DSGN_SEC_GRP_LNK','OPT_LOCK')) IS NULL
    
    BEGIN
    
        ALTER TABLE REP_DSGN_SEC_GRP_LNK
        ADD OPT_LOCK NUMERIC(10, 0) NOT NULL DEFAULT 0
    
    END;
    

    그것은 간단합니다.

  4. from https://stackoverflow.com/questions/12535405/invalid-column-name-on-sql-server-update-after-column-create by cc-by-sa and MIT license