使用带循环的一个查询将所有空字符串更改为NULL。 SQL

时间:2018-05-27 12:54:38

标签: sql sql-server database

我有表格列: [1959],[1960],[1961] ...... [2016];

所有这些列的类型为nvarchar(255),其中一些列为空字符串''。我想将空字符串更改为NULL。我写查询:

DECLARE @empty nvarchar(255);
SET @empty='';
DECLARE @cnt INT = 1959;
WHILE @cnt < 2017
BEGIN
   declare @sql nvarchar(1000)
   set @sql = 'UPDATE [HDProjEtap1Proba1].[dbo].[TESTGDP] SET [' + CAST(@cnt as nvarchar(255)) + '] = null WHERE ['+ CAST(@cnt as nvarchar(255)) +'] = ' + @empty;
   EXEC(@sql);
   SET @cnt = @cnt + 1;
END;

但是不行。消息错误:

  

Msg 102,Level 15,State 1,Line 1   '='附近的语法不正确。

你能告诉我它是怎么做的吗?

1 个答案:

答案 0 :(得分:0)

@empty为空。它连接时它不代表空字符串。

一个简单的解决方案是:

SET @empty = '''';

但是,您可以使用sp_executesql传递参数来执行相同的操作。我喜欢这种方法:

declare @cnt INT = 1959;
while @cnt < 2017
begin
   declare @sql nvarchar(1000)
   set @sql = 'UPDATE [HDProjEtap1Proba1].[dbo].[TESTGDP] SET [' + CAST(@cnt as nvarchar(255)) + '] = null WHERE ['+ CAST(@cnt as nvarchar(255)) +'] = @empty';
   exec sp_executesql @sql, N'@empty nvarchar(255)', @empty = '';
   set @cnt = @cnt + 1;
end;

或事件:

declare @cnt INT = 1959;
while @cnt < 2017
begin
   declare @sql nvarchar(1000)
   set @sql = '
UPDATE [HDProjEtap1Proba1].[dbo].[TESTGDP]
    SET [@colname] = null
    WHERE [@colname] = @empty';

   set @sql = replace(@sql, '@colname', cast(@cnt as varchar(255));

   exec sp_executesql @sql, N'@empty nvarchar(255)', @empty = '';
   set @cnt = @cnt + 1;
end;

请注意,在此版本中,SQL语句易于阅读(因此需要修改和调试)。它由参数定义,然后被替换。