복붙노트

[SQL] 변수 열 이름 동적 업데이트 문

SQL

변수 열 이름 동적 업데이트 문

우리는 NULL 대신 빈 문자열이 될 수있는 특정 테이블의 모든 NULL 값을 변경하기 위해 여러 SQL Server 데이터베이스에 업데이트를 할 찾고 있습니다. 우리는 잠재적으로 수백 개의 데이터베이스를 통해이 일을 할 것입니다. 테이블 이름은 항상 동일하지만, 열 이름 (나는이 시스템을 작성하지 않은 ... 판단하지 않는다) 프런트 엔드 응용 프로그램 구성 방법에 따라 다양하다.

미리 열 이름을 몰라도 이러한 모든 컬럼에 대한 업데이 트를 할 수있는 방법이 있나요?

해결법

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

    1.당신은 동적 SQL의 열 이름을 전달할 수 있습니다 :

    당신은 동적 SQL의 열 이름을 전달할 수 있습니다 :

    declare @sql nvarchar (1000);
    set @sql = N'update table set ' + @column_name + '= ''''';
    
    exec sp_executesql @sql;
    
  2. ==============================

    2.당신은 sys.columns 테이블에보고 테이블 이름 또는 OBJECT_ID에 가입 할 수 있습니다.

    당신은 sys.columns 테이블에보고 테이블 이름 또는 OBJECT_ID에 가입 할 수 있습니다.

     DECLARE @OBJ_ID INT
    
     SELECT @OBJ_ID = OBJECT_ID
     FROM SYS.tables
     WHERE name = 'YOURTABLE'
    
     SELECT * FROM SYS.columns
     WHERE OBJECT_ID = @OBJ_ID
    

    당신은에 업데이트를 수행하는 기초로 sys.columns 쿼리에서 이름 필드를 사용할 수 있습니다.

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

    3.(어떤 데 필요한 또는 형 필터 변경) 만 VARCHAR / CHAR 유형의 모든 열을 원하는 가정 :

    (어떤 데 필요한 또는 형 필터 변경) 만 VARCHAR / CHAR 유형의 모든 열을 원하는 가정 :

    DECLARE @tableName varchar(10)
    SET @tableName = 'yourtablenamehere'
    
    DECLARE @sql VARCHAR(MAX)
    SET @sql = ''
    
    SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = '''' WHERE ' + c.name + ' IS NULL ;'
    FROM sys.columns c
    INNER JOIN sys.tables t ON c.object_id = t.object_id
    INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
    WHERE t.name = @tableName AND y.name IN ('varchar', 'nvarchar', 'char', 'nchar')
    
    EXEC (@sql)
    
  4. ==============================

    4.이것은 커서로 달성 될 수있다. @Darren 언급처럼 당신은 먼저 당신이 그 가치와 루프와 커서를 설정, 열 이름을 선택합니다 :

    이것은 커서로 달성 될 수있다. @Darren 언급처럼 당신은 먼저 당신이 그 가치와 루프와 커서를 설정, 열 이름을 선택합니다 :

    Open oColumnsCursor
    Fetch Next From oColumnscursor
        Into @ColumnName
    
    While @@FETCH_STATUS=0
        Begin
            Set @oQuery = 'Update [DB]..[Table] Set [' + @ColumnName + '] = ''NewValue'' Where [' + @ColumnName + '] = ''OldValue'''
            Execute(@oQuery)
            Fetch Next From oColumnscursor Into @ColumnName
            Set @oCount = @oCount + 1
        End
    
    Close oColumnsCursor;
    Deallocate oColumnsCursor;
    
  5. ==============================

    5.당신이 테이블 이름을 알고있는 경우에 작동합니다 :

    당신이 테이블 이름을 알고있는 경우에 작동합니다 :

    DECLARE @tableName varchar(10)
    SET @tableName = 'Customers'
    
    DECLARE @sql VARCHAR(MAX)
    SET @sql = ''
    
    SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = ISNULL('+ c.name +','''');'
    FROM sys.columns c
    INNER JOIN sys.tables t ON c.object_id = t.object_id
    INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
    WHERE y.name IN ('varchar', 'nvarchar', 'char', 'nchar')
    AND t.name = @tableName;
    
    EXEC(@sql);
    

    그리고이 모든 테이블과 DB의 모든 열을 반복합니다 :

    DECLARE @sql VARCHAR(MAX)
    SET @sql = ''
    
    SELECT @sql = @sql + 'UPDATE ' + t.name + ' SET ' + c.name + ' = ISNULL('+ c.name +','''');'
    FROM sys.columns c
    INNER JOIN sys.tables t ON c.object_id = t.object_id
    INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
    WHERE y.name IN ('varchar', 'nvarchar', 'char', 'nchar');
    
    EXEC(@sql); 
    
  6. from https://stackoverflow.com/questions/12846743/dynamic-update-statement-with-variable-column-names by cc-by-sa and MIT license