2013-11-20 57 views
0

後我有如下表:去掉括號節省表

FirstTable

Id int PRIMARY KEY NOT NULL, 
Column1 int NOT NULL , 
Column2 int NOT NULL , 
Column3 int NOT NULL 

表被創建之後,我創建CHECK約束具有以下定義:

((列1> 0和列2> 0)或列3> 0)。

當我保存表格,然後轉到「管理檢查約束」我看到我的約束有一點不同的定義。它看起來像這樣:

([列1]>(0)和[列2]>(0)或[欄3]>(0))。

正如我們看到的,沒有我在定義創建括號,和SQL等形成圍繞對整個表達式括號。

爲什麼SQL會這樣做?是否有任何理由這樣做?

我問這個,因爲我怕可能的情況下處於不同的方式支撐則在我的定義,這可能會導致完全不同的表達。

回答

1

的優先級和高於或因此在這種情況下,括號是多餘的。 但我認爲你可以嘗試這樣的:

(Column1 > 0 AND Column2 > 0) OR (Column3 > 0) 
1

我不知道究竟是如何檢查約束存儲,但它不是一個文本表示。這是一種更高效的數據結構,可以使檢查很快完成。因此,當您要求SQL Server將它還給您時,它不知道最初使用的包圍是什麼 - 它只是返回一個表達式,它與您最初指定的內容等效。

你收到的是正好是相當於你原來給服務器的東西,就實際的邏輯而言將會被應用。

我問過這個問題,因爲恐怕可能是在我的定義中位於不同的方式的大括號,這可能導致完全不同的表達。

這不會是。它將是(邏輯上)相同的表達式,但是如果你想看到這種邏輯等價性,你可能需要自己執行一些重新排列。

,當然,你完全可以自由到原來的表達式存儲在合適的存儲庫(如源代碼控制系統),只是總是從他們的工作,而不是依靠什麼SQL Server可以生成。