2010-12-13 5 views

답변

2

이것은 테이블을 기반으로하는 간단한 방법입니다. 그냥 proc 테이블 이름을 전달하십시오. 자매 proc을 생각 테이블 이름을 반복하고 while 루프 내에서이 proc를 호출하여 루프 논리의 각 테이블에서 작업 할 수도 있습니다.

CREATE PROC setNullFields 
(@TableName NVARCHAR(100))   
AS  

CREATE TABLE #FieldNames  
( 
pk INT IDENTITY(1, 1) ,  
Field NVARCHAR(1000) NULL  
);  

INSERT INTO #FieldNames  
SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName 

DECLARE @maxPK INT;  
SELECT @maxPK = MAX(PK) FROM #FieldNames  

DECLARE @pk INT;  
SET @pk = 1  

DECLARE @dynSQL NVARCHAR(1000) 

WHILE @pk <= @maxPK  
BEGIN  

DECLARE @CurrFieldName NVARCHAR(100);  
SET @CurrFieldName = (SELECT Field FROM #FieldNames WHERE PK = @pk)  

    -- update the field to null here: 

    SET @dynSQL = 'UPDATE ' + @TableName + ' SET ' + @CurrFieldName + ' = NULLIF('+ @CurrFieldName+ ', '''')' 
    EXEC (@dynSQL) 

SELECT @pk = @pk + 1  
END  
+0

그게 아주 좋긴하지만 'ID'라는 ID 열이 있으면 "ID 열 'ID'를 (를) 업데이트 할 수 없습니다."라는 오류가 발생합니다. –

3
UPDATE mytable 
    SET col1 = NULLIF(col1, ''), 
     col2 = NULLIF(col2, ''), 
     ... 
+0

내가 아마 당신이이 사항을 적용하고 즉석에서 SQL을 생성하는 열을 파악하기 위해 INFORMATION_SCHEMA를 사용할 수 많은 테이블 –

+0

에 applly 원하는대로 쓰기 열 이름없이 만들 수있는 다른 방법이있다. –

관련 문제