Измените все пустые строки на NULL, используя один запрос с циклом.SQL - PullRequest
0 голосов
/ 27 мая 2018

У меня есть таблица со столбцами: [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;

Но не работает.Сообщение об ошибке:

Сообщение 102, уровень 15, состояние 1, строка 1 Неверный синтаксис рядом с '='.

Можете ли вы сказать мне, как это правильно?

1 Ответ

0 голосов
/ 27 мая 2018

@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 легко читается (и, следовательно, может изменяться и отлаживаться).Он определяется параметрами, которые затем впоследствии заменяются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...