2013-09-27 2 views
5

У меня есть таблица SQL, которая имеет большое количество столбцов. По некоторым причинам некоторые столбцы имеют пустые ячейки вместо NULL-ячеек. Я хотел бы сделать все пустые ячейки во всех столбцах равными NULL.Заменить пустые ячейки значениями NULL в большом количестве столбцов

Я знаю, что путь для одного столбца:

UPDATE your_table SET column = NULL WHERE column = '' 

Однако, я не уверен, как эффективно выполнить подобную логику для всех столбцов, без необходимости писать имена столбцов, по одному ,

Спасибо,

+1

Может потребоваться больше времени, чтобы выяснить, как это сделать, а не обновлять каждый столбец вручную. Фактически, прошло 17 минут с тех пор, как вы задали вопрос. Возможно, вы могли быть уже сделаны. –

+1

@ DanBracuk, что это за забава? Научиться делать это эффективно теперь может сэкономить невыносимые минуты по дороге. –

ответ

18

Выполнить следующий запрос:

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-скрипт в новый запрос и запустите его, чтобы обновить все ваши столбцы.

+0

Это аккуратный трюк! Благодаря! Но есть ли способ передать результаты вашего первого запроса тому, что я могу запустить автоматически? Я делаю это через C#, вот почему ... Спасибо! – Mayou

+0

Зависит от того, как вы делаете свой доступ к db, но говорите, что используете C# и Linq To SQL, вы можете сделать что-то вроде этого: 'using (MyDataContext db = new MyDataContext()) { string queryBuilder =". .. первый запрос сверху ... "; var resultsetOfUpdateQueries = db.ExecuteQuery (queryBuilder); foreach (string oneUpdateQuery in resultsetOfUpdateQueries) { db.ExecuteCommand (oneUpdateQuery); } } ' Не беспокойтесь о SQL-инъекции, потому что единственными компонентами переменной динамического оператора SQL будут все имена столбцов из таблицы словаря. –

+0

Зачем вам это делать, предположительно, одну задачу, в C#? – podiluska

3

Вы можете сделать запрос на syscolumns, чтобы получить список столбцов, и использовать полученные результаты для построения запроса.

select quotename(name) + ' = nullif (' + quotename(name)+ ','''')' 
from syscolumns 
where id = object_id('yourtable') 

Кроме того, если вы пишете запрос в

update yourtable 
set 
    yourcolumn=nullif(yourcolumn, ''), 
    yourcolumn2=nullif(yourcolumn2, ''), 
    ...  

, то вы можете сделать это в одном запросе без ИНЕКЕ

+0

Мне все равно придется писать каждый столбец, чтобы проверить 'nullif'. Это было бы не очень эффективно. – Mayou

+0

Спасибо. Я получаю первую часть, но я не уверен, как использовать результат первого запроса для записи второго: например, как передать имена столбцов, полученные из первого запроса ко второму запросу. – Mayou

+1

@Mariam. Легкий способ: скопировать результаты и вставить их в новый запрос. – podiluska

2

На самом деле я использую ответ Роберта Н. выше ежедневно, когда я импортирую плоские файловые наборы данных, поэтому я поместил его в хранимую процедуру, чтобы передать имя таблицы. Он просто заполняет временную таблицу операциями обновления, а затем выполняет каждую строку в таблице.

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 '[email protected]+' 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 
Смежные вопросы