2016-01-08 46 views
0

我正在將Access數據庫遷移到SQL Server 2014 Express後端,並且應用程序按原樣設計爲在某些表中的某些列中放置空字符串,而不是NULL (訪問在附加表單上的行爲)。SQL Server觸發器將NULL更改爲空字符串

原來我不能,因爲當通過連接到綁定的形式表不允許在這些列空ODBC連接表顯式訪問時試圖插入NULL值,當有人簡單地刪除列的內容,甚至如果我有一個默認值在表中定義。

我想先說一下,我將解決這個問題以正確處理NULL,但對於'現在',我的優先考慮是將後端轉換爲與Access中操作相同的SQL,所以我只想要一個觸發器將幾個字段上的NULL值更改爲空字符串,直到我可以查看所有期望這些字段中的空字符串並將其更改爲處理NULL的應用程序邏輯。

我想出了以下內容:

CREATE TRIGGER TABLE1_ReplaceNulls 
ON TABLE1 
AFTER INSERT, UPDATE 
AS 
    IF UPDATE(FIELDWNULL1) 
    BEGIN 
     UPDATE TABLE1 
     SET FIELDWNULL1 = '' 
     FROM inserted I 
     INNER JOIN TABLE1 ON I.PKFIELD = TABLE1.PKFIELD 
     WHERE I.FIELDWNULL1 IS NULL; 
    END; 

這工作得很好了一列。對於同一個表中的多個列,我最好如何做到這一點?我有一個包含4列的表,它們都可以包含NULLS,但是我想要空字符串來代替它們。

我應該爲每個可能包含NULL的列做一個單獨的IF塊嗎?或者只是一次處理它?當然,如果我一次處理它,我將不得不考慮一些列可能具有合法值,但是如果我執行單獨的語句,那麼它可以在插入列後實質上運行4次更新。也許這並不重要,因爲這只是暫時的,但只是對其他更有經驗的想法感到好奇。

+0

Access只把空字符串,如果這樣設計的。作爲在整個申請中採用標準來存儲空值的一般規則是優選的。如果Access表設計遵循此標準,則遷移到SQL服務器將是無縫的。如果Access表設計不允許ZLS,那麼清空Access窗體中的文本框將導致表中的空值。因此,將這些應用程序遷移到SQL Server將繼續工作,而不會更改VBA代碼。清空文本框將在SQL Server和Access中保存爲空。一個人應該避免混合使用ZLS和空值 –

回答

1

使用下面的update語句,更新一個trans中的所有四列。此代碼未經測試。

 UPDATE TABLE1 
     SET FIELDWNULL1=iif(FIELDWNULL1 is null,'',FIELDWNULL1), 
     FIELDWNULL2=iif(FIELDWNULL2 is null,'',FIELDWNULL2), 
     FIELDWNULL3=iif(FIELDWNULL3 is null,'',FIELDWNULL3), 
     FIELDWNULL4=iif(FIELDWNULL4 is null,'',FIELDWNULL4) 

     FROM inserted I INNER JOIN TABLE1 
      ON I.PKFIELD = TABLE1.PKFIELD 

新的觸發代碼:隨着IIF語句

CREATE TRIGGER TABLE1_ReplaceNulls ON TABLE1 
AFTER INSERT, UPDATE 
AS 

--IF UPDATE(FIELDWNULL1) 
    BEGIN 
     UPDATE TABLE1 
     SET FIELDWNULL1=iif(FIELDWNULL1 is null,'',FIELDWNULL1), 
     FIELDWNULL2=iif(FIELDWNULL2 is null,'',FIELDWNULL2), 
     FIELDWNULL3=iif(FIELDWNULL3 is null,'',FIELDWNULL3), 
     FIELDWNULL4=iif(FIELDWNULL4 is null,'',FIELDWNULL4) 

     FROM inserted I INNER JOIN TABLE1 
      ON I.PKFIELD = TABLE1.PKFIELD 
      --WHERE I.FIELDWNULL1 IS NULL; 
    END; 

隨着ISNULL()函數

CREATE TRIGGER TABLE1_ReplaceNulls ON TABLE1 
AFTER INSERT, UPDATE 
AS 

--IF UPDATE(FIELDWNULL1) 
    BEGIN 
     UPDATE TABLE1 
     SET FIELDWNULL1=ISNULL(FIELDWNULL1,''), 
     FIELDWNULL2=ISNULL(FIELDWNULL2,''), 
     FIELDWNULL3=ISNULL(FIELDWNULL3,''), 
     FIELDWNULL4=ISNULL(FIELDWNULL4,'') 

     FROM inserted I INNER JOIN TABLE1 
      ON I.PKFIELD = TABLE1.PKFIELD 
      --WHERE I.FIELDWNULL1 IS NULL; 
    END; 
+0

好吧,這就是我在選擇2時的想法。我認爲檢查以確保字段更新可能稍微有效一些,但正如我所說的,我認爲效率並不是真正的問題現在,因爲無論如何這都應該是暫時的。我會很快對此進行測試,以驗證它是否按預期工作。謝謝。 –

+0

@TravisP請讓stackoverflow知道它是否工作! – Hiten004

+1

(cc:@TravisP) - 使用'ISNULL(FieldName,'')'會更緊湊一些,否則它看起來是一個很好的解決方法。 –