2011-12-01 2 views
0

데이터베이스의 모든 셀에서 공백을 NULL로 바꾸어야합니다. SQL 서버 2008 r2. 효율적인 무언가를 찾고 있는데 커서처럼 보이는 것이 유일한 방법일까요?데이터베이스에서 foreach 셀을 쿼리하는 방법

+0

데이터베이스 서버에있는 모든 데이터베이스의 모든 테이블의 모든 행 (열)은 어떻게됩니까? –

+0

@ypercube 단 하나의 데이터베이스 – user194076

+1

'INFORMATION_SCHEMA'와 동적 SQL을 사용해야합니다. –

답변

1

커서 답 :

ypercube이 어려운 부분을 한 결코 없습니다. 이 정보를 가져 와서 반복하면서 각 테이블의 각 열에 대한 업데이트 명령문을 실행해야합니다. WHILE 문을 사용하여이를 수행 할 수 있습니다.

--Set database to use 
USE [MyDatabase]; 
GO 

--Create table variable to hold table/column pairs 
DECLARE @table TABLE (
    [Key] BIGINT PRIMARY KEY IDENTITY (1, 1), 
    [TABLE_NAME] VARCHAR(100), 
    [COLUMN_NAME] VARCHAR(100) 
); 

--Populate table variable 
INSERT INTO @table ([TABLE_NAME], [COLUMN_NAME]) 
SELECT [TABLE_NAME], [COLUMN_NAME] 
FROM MyDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE [TABLE_SCHEMA] = 'dbo' 
AND [IS_NULLABLE] = 'YES'; 

--Initialize counting variables 
DECLARE @counter BIGINT = 1; 
DECLARE @max BIGINT = (SELECT COUNT(1) FROM @table); 

--Iterate through each pair 
WHILE @counter <= @max 
BEGIN 
    --Assign the current pair values to variables 
    DECLARE @TableName VARCHAR(100), @ColumnName VARCHAR(100); 
    SELECT @TableName = [TABLE_NAME], @ColumnName = [COLUMN_NAME] 
    FROM @table 
    WHERE [Key] = @counter; 

    --Execute dynamic SQL 
    EXEC 
    (
     'UPDATE [' + @TableName + ']' + 
     'SET [' + @ColumnName + '] = NULL' + 
     'WHERE RTRIM([' + @ColumnName + ']) = '''';' 
    ); 

    --Increment the counter 
    SET @counter = @counter + 1; 
END 
+0

너무 재밌 네요. 나는 1 시간 전에 똑같은 대본을 썼다. 감사합니다. @ypercube – user194076

+0

괜찮습니다. 도와 줘서 다행 :) – JOpuckman

0

공백을 정의하는 방법에 따라 달라집니다. 다음은 효과가 있습니까?

update mytable set mycolumn = null where len(rtrim(ltrim(mycolumn))) = 0 
+0

모든 셀과 모든 테이블에서 쿼리를 수행해야합니다. 하나의 열뿐만 아니라 – user194076

2

먼저 INFORMATION_SCHEMA를 사용하여, null 허용 입력 CHAR 또는 VARCHAR의 모든 테이블과 열을 찾을 수 :

SELECT TABLE_NAME, COLUMN_NAME 
FROM MyDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'dbo' 
    AND IS_NULLABLE = 'YES' 
관련 문제