2014-03-24 38 views
0

我有一個名爲dbo.authors的表,並且希望將此表中的所有空字段更新爲空字符串。 (基本上與此完全相反:How can I update all empty string fields in a table to be null?如何更新表中的所有NULL字段以清空字符串SQL Server 2008

我試過這個,我得到一個'命令成功'的消息,但它不會將空字段更新爲空字符串。

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 
+0

數字和日期列怎麼樣?你有沒有這些,如果是的話,你想在那裏放什麼? –

+0

在您的UPDATE語句中,WHERE子句之後需要一個SPACE。 – abhi

+0

我想在日期或數字列中放置一個空白空間(如果可能的話) – Eric

回答

0

在查詢字符串的結尾處,您有這樣的:

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

有(至少)在剛剛那個小四點的問題。一個是你缺少字段名稱周圍的空白。另一個原因是它無法解釋有問題的列名。另一個是你不能做這樣的空比較。最後,代碼將添加一個空格,而不是一個空字符串。這樣做代替:

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

翻遍代碼,我懷疑這是唯一的問題,但。至少,你也要確保你只查看字符串類型的列(varchar,char,nvarchar,nchar等)。對於數字(數字,整型,浮點等)和時態(日期,日期時間等)列,您將無法做到這一點。如果你想擺脫這些列的NULL值,你需要選擇其他的默認值。

我也質疑這樣做的智慧。這通常不是一個好主意(雖然有少數情況下它可以有意義)。

+0

我用你的建議修改了查詢字符串的末尾。 此外,我所有的列都是字符串類型的列。它仍然沒有工作。 – Eric

+1

「不工作」對幫助不大。你有沒有嘗試添加一個打印語句來輸出每個記錄的構造的SQL?這會幫助你找到問題。 –

+0

你也可以使用''='''',其中'+ QUOTENAME(@CurrFieldName)+'IS null''。優點是它將正確地轉義任何引用標識符。 –

相關問題