2016-04-26 78 views
1

我有一個SSIS包,它從平面文件讀入數據並將其寫入到sql server 2012數據庫。數據包含一些字段的空值。我想保留具有空值的行,但將其替換爲默認值,而無需對每列執行轉換(在許多表中有數百列)。從SSIS包中替換SQL Server 2012中的空值

是否有任何sql命令/腳本來更新任何null跨越一組表與基於數據類型的默認值無論列?或者,SSIS 2012中有沒有一種方法可以在每列不使用數據轉換的情況下將默認值替換爲null?

例如,我是否爲我們有電子郵件地址的客戶提供了「email」(varchar(255))列。然後,我怎樣才能將每個空值更改爲一個空字符串(''),但跨越數百個表而不明確指定每個空值?

我已經嘗試在表定義中使用默認值,但它仍然使用NULL值,因爲它們是明確發送的。

回答

1

嗯,我已經學會了一些有趣的東西,並可能對你有用。

我已經知道,這是可以插入所有默認值的一排這樣的:

INSERT INTO dbo.DefTest DEFAULT VALUES; 

你的問題讓我不知道是否有以更新值設置爲缺省值類似的方式。所以我嘗試了這個實驗:

CREATE TABLE dbo.DefTest (
    Id int NULL DEFAULT (0) 
, AStr varchar(15) NULL DEFAULT ('A') 
, BStr varchar(15) NULL DEFAULT ('B') 
, TF bit NULL DEFAULT (0) 
, Amount money NULL DEFAULT (100.00) 
); 

INSERT INTO dbo.DefTest VALUES (1,'Test','Test',1,20); 
INSERT INTO dbo.DefTest DEFAULT VALUES; 
INSERT INTO dbo.DefTest VALUES (NULL,NULL,NULL,NULL,NULL); 

SELECT * FROM dbo.DefTest; 

SELECT產生了你期望的結果。具有指定值的行,具有所有默認值的行以及具有所有NULL值的行。

然後我嘗試這樣的:

UPDATE dbo.DefTest 
SET Id = DEFAULT 

結果是什麼我所希望的:所有行具有0 ID值,默認值。

我們設定每列其默認值只有當它是目前空,我需要使用CASE語句,所以我想這:

UPDATE dbo.DefTest 
SET Id=CASE WHEN Id IS NULL THEN DEFAULT ELSE Id END 
, AStr = CASE WHEN AStr IS NULL THEN DEFAULT ELSE AStr END 
, BStr = CASE WHEN BStr IS NULL THEN DEFAULT ELSE BStr END 
, TF = CASE WHEN TF IS NULL THEN DEFAULT ELSE TF END 
, Amount = CASE WHEN Amount IS NULL THEN DEFAULT ELSE Amount END 

但我得到:

關鍵字'DEFAULT'附近的語法不正確。

所以我猜UPDATE語句只能使用DEFAULT作爲列值的直接賦值。

所以,做你想做什麼,你只需要運行一個更新具有您要用來替換空值的默認值的每一列:

UPDATE MyTable 
SET MyColumn = DEFAULT 
WHERE MyColumn IS NULL 

我已經驗證了這個工程。

通過查詢元視圖/表以及生成動態sql語句並執行它們,您可以節省編寫數百條語句的麻煩。