我有表格列: [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 '='附近的语法不正确。
你能告诉我它是怎么做的吗?
答案 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语句易于阅读(因此需要修改和调试)。它由参数定义,然后被替换。