2013-09-27 185 views
5

Tôi có bảng SQL có số cột lớn. Đối với một số lý do, một số cột có các ô trống thay vì các ô NULL. Tôi muốn làm cho tất cả các ô trống trong tất cả các cột là NULL.Thay thế ô trống bằng giá trị NULL bằng số lượng lớn các cột

Tôi biết rằng con đường để đi cho một cột duy nhất là:

UPDATE your_table SET column = NULL WHERE column = '' 

Tuy nhiên, tôi không chắc chắn làm thế nào để thực hiện một logic tương tự một cách hiệu quả cho tất cả các cột mà không cần phải viết các tên cột từng người một .

Cảm ơn,

+1

Có thể mất nhiều thời gian hơn để tìm ra cách thông minh hơn để cập nhật từng cột theo cách thủ công. Thực tế, đã 17 phút kể từ khi bạn đặt câu hỏi. Có thể bây giờ bạn đã có thể làm xong. –

+1

@DanBracuk có gì vui không? Học cách thực hiện điều này một cách hiệu quả ngay bây giờ có thể tiết kiệm được số phút chưa kể trên đường. –

Trả lời

18

Chạy truy vấn sau đây:

SELECT 'UPDATE yourtable SET ' + name + ' = NULL WHERE ' + name + ' = '''';' 
FROM syscolumns 
WHERE id = object_id('yourtable') 
    AND isnullable = 1; 

Kết quả của truy vấn này sẽ là một đoạn mã SQL như sau:

UPDATE yourtable SET column1 = NULL WHERE column1 = ''; 
UPDATE yourtable SET column2 = NULL WHERE column2 = ''; 
UPDATE yourtable SET column3 = NULL WHERE column3 = ''; 
-- etc... 

Sao chép và dán tập lệnh SQL đó vào truy vấn mới và chạy nó để cập nhật tất cả các cột của bạn.

+0

Đó là một mẹo nhỏ gọn! Cảm ơn! Nhưng có cách nào tôi có thể vượt qua các kết quả của truy vấn đầu tiên của bạn để một cái gì đó mà tôi có thể chạy tự động? Tôi đang làm điều này thông qua C#, đó là lý do tại sao ... Cảm ơn! – Mayou

+0

Tùy thuộc vào cách bạn đang thực hiện truy cập db của mình, nhưng giả sử bạn đang sử dụng C# và LINQ To SQL, bạn có thể làm điều gì đó như sau: 'using (MyDataContext db = new MyDataContext()) { truy vấn chuỗiBuilder =". .. truy vấn đầu tiên từ trên cao ... "; var resultsetOfUpdateQueries = db.ExecuteQuery (queryBuilder); foreach (chuỗi oneUpdateQuery trong resultsetOfUpdateQueries) { db.ExecuteCommand (oneUpdateQuery); } } ' Không phải lo lắng về việc tiêm SQL vì các thành phần biến duy nhất của câu lệnh SQL động sẽ là các tên cột từ một bảng từ điển. –

+0

Tại sao bạn làm điều này, có lẽ một nhiệm vụ tắt, trong C#? – podiluska

3

Bạn có thể làm một truy vấn trên syscolumns để có được một danh sách các cột, và sử dụng kết quả để xây dựng truy vấn của bạn.

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

Ngoài ra, nếu bạn viết câu hỏi của bạn như

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

sau đó bạn có thể làm điều đó trong một truy vấn duy nhất mà không có một mệnh đề where

+0

Tôi vẫn phải viết từng cột để kiểm tra 'nullif'. Điều đó sẽ không hiệu quả lắm. – Mayou

+0

Cảm ơn. Tôi nhận được phần đầu tiên, nhưng tôi không chắc chắn làm thế nào để sử dụng kết quả của truy vấn đầu tiên để viết câu lệnh thứ hai: tức là cách chuyển tên cột thu được từ truy vấn đầu tiên đến truy vấn thứ hai – Mayou

+1

@Mariam Cách dễ dàng là sao chép các kết quả và dán chúng vào một truy vấn mới. – podiluska

2

Tôi thực sự sử dụng câu trả lời của Robert N ở trên hàng ngày khi tôi nhập tập dữ liệu tệp phẳng, vì vậy tôi đặt nó vào một thủ tục được lưu trữ để tôi có thể chuyển tên bảng. Nó chỉ điền một bảng tạm thời với các câu lệnh cập nhật, sau đó thực thi mỗi hàng trong bảng.

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