2010-12-13 84 views

回答

2

这是一个基于表格的简单方法。只需传递表名即可。你也可以创建一个姐妹进程来循环思想表名,并在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”。“ – 2010-12-15 03:16:10

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

是任何其他办法让它不写列名,因为我想它applly多个表 – 2010-12-13 19:04:30

+0

也许你可以使用INFORMATION_SCHEMA找出列,这适用于和动态生成SQL。 – 2010-12-13 21:42:23