如何更新表中的所有NULL字段以清空SQL SERVER 2008的字符串

时间:2014-03-24 17:11:51

标签: sql-server-2008

我有一个名为dbo.authors的表,并希望将此表中的所有空字段更新为空字符串。 (基本上与此完全相反:How can I update all empty string fields in a table to be null?

我已经尝试了这个并且我得到了一个'命令成功'消息,但它没有将空字段更新为空字符串。

CREATE PROC resetNullFields 
(@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 null to empty string here:

    SET @dynSQL = 'UPDATE ' + @TableName + ' SET ' + @CurrFieldName + ' ='' '' where' + @CurrFieldName + '= null'  
    EXEC (@dynSQL)

 SELECT @pk = @pk + 1    
END    

exec resetNullFields authors;
go

1 个答案:

答案 0 :(得分:0)

在查询字符串的最后,你有这个:

' ='' '' where' + @CurrFieldName + '= null' 

这一小部分(至少)有四个问题。一个是你缺少字段名称周围的空格。另一个原因是它没有考虑有问题的列名。另一个是你不能像那样进行空比较。最后,代码将添加一个空格,而不是空字符串。这样做是这样的:

' ='''' where [' + @CurrFieldName + '] IS null' 

仔细查看代码,我怀疑这是唯一的问题。至少,您还要确保只查看字符串类型的列(varchar,char,nvarchar,nchar等)。您将无法对数字(数字,整数,浮点数等)和时间(日期,日期时间等)列执行此操作。如果你想在这些列中删除NULL值,你需要选择其他默认值。

我也质疑这样做的智慧。这通常不是一个好主意(尽管有少数场景可以理解)。