Q. 我的SQL Server數據表中有一列允許為空(NULL)值。在該列有非空值的時候,我想讓該列的值為唯一值。通過編程實現這一目標的最佳做法是什麼呢?如果我在該列中設置一個UNIQUE約束,我可以只在一個記錄中保有空值。我正在使用觸發器來強制執行這個限制,但是你能推薦一種更簡單的方法來確保所有非空的值都是唯一的嗎?
A. SQL Server沒有內置的機制可以禁止非空值產生重復,所以你需要使用一個自定義的CHECK約束來實現這個限制。例如,以下代碼就可以實現你所要的那種完整性。
USE tempdb
Create table t1 (c1 int NULL, c2 char(5) NULL)
Create trigger mytrigger on t1 for insert, update as
BEGIN
IF (select max(cnt) from (select count(i.c1)
as cnt from t1, inserted i where t1.c1=i.c1 group
by i.c1) x) > 1
ROLLBACK TRAN
END
在SQL Server 2000中,你還可以使用INSTEAD OF觸發器來執行這個限制。同INSTEAD OF觸發器有關的更多信息,請參閱以下文章,要查看這些文章,請訪問SQL Server Magazine,在InstantDoc(快速文檔)框中輸入InstantDoc編號,然後點擊“Go”。Tw.wiNGWit.com文章包括:
INSTEAD OF觸發器的使用竅門;InstantDoc編號 15828
視圖中的INSTEAD OF觸發器;InstantDoc 編號 15791
INSTEAD OF觸發器;InstantDoc 編號 15524
SQL Server Profiler和參數化語句
問:自從升級到SQL Server 2000後,我在SQL事件查看器中遇到了一個問題:我無法捕獲帶有參數的Transact-SQL語句。我希望獲得查詢執行過程中參數的實際取值,而並非諸如@p1這樣的參數形式。請問如何在不引用跟蹤過程中其它行的情況下對參數取值加以置換。
答:您必須獲取跟蹤過程的其它部分(如存儲過程StmtCompleted所返回的結果),並將這些部分收集在一起(語句放在最前面)以捕獲完整的查詢內容。之所以會出現這樣的結果,其原因在於從SQL Server關系型引擎恢復數據的SQL事件查看器方法。這樣的問題在SQL Server 7.0中同樣存在。然而,由於當事件產生時,位於引擎內部的參數取值是未知的,因此,我們無法在這一時刻做出修改。
將一個SQL Server系統用作一台PDC
問:我的公司建立了一個災難恢復站點,並且計劃在一台新配備的計算機上安裝SQL Server。Microsoft Windows NT管理員希望使用運行SQL Server的計算機作為主域控制器(PDC)。我聽說,由於PDC需要完整維護與復制網絡帳號數據庫所引發的資源密集型任務並且需要執行網絡登陸驗證操作,因此,這種配置方案並非一種良好的方式。那麼,請問運行SQL Server的計算機能夠轉而充當備份域控制器(BDC)呢?從技術上講,將SQL Server配置為PDC或BDC是否可能呢?
答:當您在PDC或BDC上安裝SQL Server時,它仍可保持良好的工作狀態。如需確定某種配置方案能否適應於您的站點,應當考慮您所擁有的資源。如果您擁有足夠的網絡帶寬、內存空間與空閒處理器,那麼,使用運行SQL Server的計算機作為域控制器便是一種合理的方案。然而,在這種情況下,根據域的實際規模,相應的計算機可能需要承擔大量工作負載。如果您認為SQL Server的任務將會非常繁重,那麼,便請不要再讓其運行任何其它服務。
From:http://tw.wingwit.com/Article/program/SQLServer/201404/30297.html