Заменить пустые ячейки значениями NULL в большом количестве столбцов
У меня есть таблица SQL, которая имеет большое количество столбцов. По какой-то причине некоторые столбцы имеют пустые ячейки вместо нулевых ячеек. Я хотел бы сделать все пустые ячейки во всех столбцах равными NULL.
Я знаю, что путь для одного столбца:
UPDATE your_table SET column = NULL WHERE column = ''
однако я не уверен, как эффективно выполнить аналогичную логику для всех столбцов без необходимости писать имена столбцов один за другим.
спасибо,
3 ответов
выполнить следующий запрос:
SELECT 'UPDATE yourtable SET ' + name + ' = NULL WHERE ' + name + ' = '''';'
FROM syscolumns
WHERE id = object_id('yourtable')
AND isnullable = 1;
вывод этого запроса будет фрагментом SQL-скрипта, как это:
UPDATE yourtable SET column1 = NULL WHERE column1 = '';
UPDATE yourtable SET column2 = NULL WHERE column2 = '';
UPDATE yourtable SET column3 = NULL WHERE column3 = '';
-- etc...
скопируйте и вставьте этот сценарий SQL в новый запрос и запустите его, чтобы обновить все столбцы.
вы можете сделать запрос на syscolumns
для получения списка столбцов, и использовать результаты для построения запроса.
select quotename(name) + ' = nullif (' + quotename(name)+ ','''')'
from syscolumns
where id = object_id('yourtable')
кроме того, если вы напишите свой запрос как
update yourtable
set
yourcolumn=nullif(yourcolumn, ''),
yourcolumn2=nullif(yourcolumn2, ''),
...
затем вы можете сделать это в одном запросе без предложения where
Я фактически использую ответ Роберта N выше ежедневно, когда импортирую наборы данных плоских файлов, поэтому я помещаю его в хранимую процедуру, в которую я могу передать имя таблицы. Он просто заполняет временную таблицу инструкциями update, а затем выполняет каждую строку в таблице.
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: LikeableBias
-- Create date: 2016-06-27
-- Description: Finds and NULLs all blank values in table where column allows nulls
-- =============================================
CREATE PROCEDURE [dbo].[sproc_NullBlanks]
@tablename NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
--------Insert update statements to temp table for execution
DECLARE @statements TABLE (statement NVARCHAR(MAX))
INSERT INTO @statements
( statement )
SELECT ('UPDATE '+@tablename+' SET [' + name + '] = NULL WHERE ' + name + ' = '''';')
FROM syscolumns
WHERE id = OBJECT_ID(@tablename)
AND isnullable = 1;
--------Open cursor, execute statements, then close cursor
DECLARE @statement NVARCHAR(MAX)
DECLARE cur CURSOR LOCAL FOR
SELECT statement FROM @statements
OPEN cur
FETCH NEXT FROM cur INTO @statement
WHILE @@FETCH_STATUS = 0 BEGIN
EXEC sys.sp_executesql @statement
FETCH NEXT FROM cur INTO @statement
END
CLOSE cur
DEALLOCATE cur
END
GO