[SQL] 변수 열 이름 동적 업데이트 문
SQL변수 열 이름 동적 업데이트 문
우리는 NULL 대신 빈 문자열이 될 수있는 특정 테이블의 모든 NULL 값을 변경하기 위해 여러 SQL Server 데이터베이스에 업데이트를 할 찾고 있습니다. 우리는 잠재적으로 수백 개의 데이터베이스를 통해이 일을 할 것입니다. 테이블 이름은 항상 동일하지만, 열 이름 (나는이 시스템을 작성하지 않은 ... 판단하지 않는다) 프런트 엔드 응용 프로그램 구성 방법에 따라 다양하다.
미리 열 이름을 몰라도 이러한 모든 컬럼에 대한 업데이 트를 할 수있는 방법이 있나요?
해결법
-
==============================
1.당신은 동적 SQL의 열 이름을 전달할 수 있습니다 :
당신은 동적 SQL의 열 이름을 전달할 수 있습니다 :
declare @sql nvarchar (1000); set @sql = N'update table set ' + @column_name + '= '''''; exec sp_executesql @sql;
-
==============================
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.(어떤 데 필요한 또는 형 필터 변경) 만 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.이것은 커서로 달성 될 수있다. @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.당신이 테이블 이름을 알고있는 경우에 작동합니다 :
당신이 테이블 이름을 알고있는 경우에 작동합니다 :
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);
from https://stackoverflow.com/questions/12846743/dynamic-update-statement-with-variable-column-names by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 GREATEST와 유사한 SQL Server 2008의 기능? (0) | 2020.04.21 |
---|---|
[SQL] 하나 개의 테이블에 여러 계급 (0) | 2020.04.21 |
[SQL] CROSS에 포스트 그레스 아날로그는 SQL 서버에 적용 (0) | 2020.04.21 |
[SQL] SQL 서버 UNION - 행동 BY 기본 ORDER 무엇 (0) | 2020.04.21 |
[SQL] SELECT *를 사용에서 성능 문제? [복제] (0) | 2020.04.21 |